我们有一组为ASCII字符集开发的应用程序.现在,我们正试图在冰岛安装它,并且遇到了冰岛角色搞砸的问题.
我们正在解决我们的问题,但我想知道:是否有一个很好的"指南"用于编写专为8位字符设计的C++代码,并且在为其提供UTF-8数据时它将正常工作?
我不能指望每个人都阅读整个Unicode标准,但如果有更易于理解的东西,我想与团队分享,所以我们不会再遇到这些问题.
重写所有应用程序以使用wchar_t或其他字符串表示形式目前是不可行的.我还要注意,这些应用程序通过网络与使用8位字符的服务器和设备进行通信,因此即使我们在内部使用Unicode,我们仍然会遇到边界转换问题.在大多数情况下,这些应用程序只传递数据; 他们不会以任何方式"处理"文本,除了将文本从一个地方复制到另一个地方.
使用的操作系统是Windows和Linux.我们使用std :: string和普通的C字符串.(并且不要让我为任何设计决定辩护.我只是想帮助解决这个问题.)
以下列出了已建议的内容:
绝对最低每个软件开发人员绝对必须知道Unicode和字符集(没有借口!)
Unix/Linux的UTF-8和Unicode FAQ
Unicode HOWTO
Mike Dimmick.. 10
在大多数情况下,只需要8位清洁.但是,您必须注意,任何非ASCII字符都会分割多个字节,因此如果要显示换行符或截断文本,则必须考虑这一点.
UTF-8的优势在于您始终可以确定多字节字符的位置:如果第7位置1且第6位复位(字节为0x80-0xBF),则这是一个尾随字节,而如果第7位和第6位是set和5复位(0xC0-0xDF)它是一个带有一个尾随字节的前导字节; 如果设置了7,6和5并且复位了4(0xE0-0xEF),则它是带有两个尾随字节的前导字节,依此类推.设置在最高有效位的连续位数是组成字符的总字节数.那是:
110x xxxx =双字节字符
1110 xxxx =三字节字符
1111 0xxx =四字节字符
等
冰岛字母表全部包含在ISO 8859-1中,因此包含在Windows-1252中.如果这是一个控制台模式应用程序,请注意控制台使用IBM代码页,因此(取决于系统区域设置)它可能显示在437,850或861中.Windows没有UTF-8的原生显示支持; 您必须转换为UTF-16并使用Unicode API.
如果是控制台模式应用程序,则调用SetConsoleCP和SetConsoleOutputCP(指定代码页1252)将有助于解决您的问题.不幸的是,选择的控制台字体必须是支持代码页的字体,我看不到设置字体的方法.标准位图字体仅支持系统默认OEM代码页.
在大多数情况下,只需要8位清洁.但是,您必须注意,任何非ASCII字符都会分割多个字节,因此如果要显示换行符或截断文本,则必须考虑这一点.
UTF-8的优势在于您始终可以确定多字节字符的位置:如果第7位置1且第6位复位(字节为0x80-0xBF),则这是一个尾随字节,而如果第7位和第6位是set和5复位(0xC0-0xDF)它是一个带有一个尾随字节的前导字节; 如果设置了7,6和5并且复位了4(0xE0-0xEF),则它是带有两个尾随字节的前导字节,依此类推.设置在最高有效位的连续位数是组成字符的总字节数.那是:
110x xxxx =双字节字符
1110 xxxx =三字节字符
1111 0xxx =四字节字符
等
冰岛字母表全部包含在ISO 8859-1中,因此包含在Windows-1252中.如果这是一个控制台模式应用程序,请注意控制台使用IBM代码页,因此(取决于系统区域设置)它可能显示在437,850或861中.Windows没有UTF-8的原生显示支持; 您必须转换为UTF-16并使用Unicode API.
如果是控制台模式应用程序,则调用SetConsoleCP和SetConsoleOutputCP(指定代码页1252)将有助于解决您的问题.不幸的是,选择的控制台字体必须是支持代码页的字体,我看不到设置字体的方法.标准位图字体仅支持系统默认OEM代码页.