我们有一组针对 ASCII 字符集开发的应用程序。现在,我们正尝试在冰岛安装它,但遇到了冰岛字符被搞砸的问题。
我们正在解决我们的问题,但我想知道:是否有一个好的“指南”来编写专为 8 位字符设计的 C++ 代码,并且在提供 UTF-8 数据时可以正常工作?
我不能指望每个人都能阅读整个 Unicode 标准,但如果有更容易理解的内容,我想与团队分享,这样我们就不会再次遇到这些问题。
目前重写所有应用程序以使用 wchar_t 或其他字符串表示形式是不可行的。我还要指出的是,这些应用程序通过网络与使用 8 位字符的服务器和设备进行通信,因此即使我们在内部使用 Unicode,我们仍然会遇到边界翻译问题。大多数情况下,这些应用程序只是传递数据;除了将文本从一个地方复制到另一个地方之外,他们不会以任何方式“处理”文本。
使用的操作系统是Windows和Linux。我们使用 std::string 和普通的 C 字符串。 (不要要求我为任何设计决策辩护。我只是想帮助解决这个问题。)
以下是建议内容的列表:
- 每个软件开发人员绝对必须了解 Unicode 和字符集的绝对最低限度(没有任何借口!) http://www.joelonsoftware.com/articles/Unicode.html
- Unix/Linux 的 UTF-8 和 Unicode 常见问题解答 http://www.cl.cam.ac.uk/~mgk25/unicode.html
- 统一码指南 ftp://ftp.ilog.fr/pub/Users/haible/utf8/Unicode-HOWTO.html
大多数情况下,只需保持 8 位干净即可。但是,您必须注意任何非 ASCII 字符都会拆分为多个字节,因此如果要换行或截断文本以进行显示,则必须考虑到这一点。
UTF-8 的优点是您始终可以知道多字节字符中的位置:如果设置了位 7 并且重置了位 6(字节为 0x80-0xBF),则这是一个尾随字节,而如果设置了位 7 和位 6,则这是一个尾随字节。置位且 5 复位 (0xC0-0xDF),它是一个前导字节和一个尾随字节;如果设置了 7、6 和 5 并且重置了 4 (0xE0-0xEF),则它是一个前导字节,带有两个尾随字节,依此类推。设置在最高有效位的连续位数是组成字符的字节总数。那是:
110x xxxx = 两字节字符
1110 xxxx = 三字节字符
1111 0xxx = 四字节字符
etc
冰岛字母全部包含在 ISO 8859-1 中,因此也包含在 Windows-1252 中。如果这是控制台模式应用程序,请注意控制台使用 IBM 代码页,因此(取决于系统区域设置)它可能会显示为 437、850 或861 http://en.wikipedia.org/wiki/Code_page_861。 Windows 没有对 UTF-8 的本机显示支持;您必须转换为 UTF-16 并使用 Unicode API。
如果它是控制台模式应用程序,则调用 SetConsoleCP 和 SetConsoleOutputCP 并指定代码页 1252 将有助于解决您的问题。不幸的是,选择的控制台字体必须是支持代码页的字体,并且我看不到设置字体的方法。标准位图字体仅支持系统默认的 OEM 代码页。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)