2008-09-25 59 views
10

我们有一套为ASCII字符集开发的应用程序。现在,我们正在尝试将它安装在冰岛,并且遇到了冰岛人物被搞砸的问题。你如何编写对UTF-8安全的代码?

我们正在解决我们的问题,但我想知道:是否有一个很好的“指南”,用于编写专为8位字符设计的C++代码,以及在UTF-8数据发送给它?

我不能指望每个人都阅读整个Unicode标准,但如果有更易消化的东西,我想与团队分享,这样我们就不会再遇到这些问题。

重写所有应用程序以使用wchar_t或其他字符串表示形式目前不可行。我还会注意到,这些应用程序通过网络与使用8位字符的服务器和设备进行通信,所以即使我们在内部执行了Unicode,我们在边界处仍然存在翻译问题。大多数情况下,这些应用程序只是传递数据;他们不会以任何方式“处理”文本,只能将文本从一个地方复制到另一个地方。

使用的操作系统是Windows和Linux。我们使用std :: string和普通的C字符串。 (不要问我任何辩护的设计决定的,我只是想帮助解决混乱。)


这里是什么已经建议名单:

+0

您能否确认我们您的应用的操作系统?你是否为Windows编程?你是大量使用std :: string还是更低层次的 C头? – paercebal 2008-09-25 16:54:15

+0

如果你喜欢一个答案,请注意它 - 没有理由吝啬。 – 2008-09-25 17:02:48

+0

只有30分钟,你已经要求重新提升? :) – 2008-09-25 17:15:56

回答

-1

您可能需要使用宽ç字符(wchar_t代替char和std :: wstring而不是std :: string)。这并不能自动解决你的问题,但这是第一步。

也可以使用支持Unicode的字符串函数(请参阅文档)。如果有东西操纵宽字符或字符串,它通常意识到它们很宽。

+0

重写所有应用程序以使用不同的字符表示方式是不可行的。 – 2008-09-25 16:46:57

1

注意,完整的Unicode不适合16位字符;所以要么使用32位字符,要么使用可变宽度编码(UTF-8是最流行的)。

0

冰岛使用ISO Latin 1,所以8位应该足够了。我们需要更多细节来弄清楚发生了什么。

1

UTF-8的设计正是考虑到您的问题。我要注意的一件事情是,ASCII是一个7位编码,所以如果你的基础设施的任何部分使用第8位用于其他目的,这可能是棘手的。

10

只是8位干净,大部分。但是,您必须注意,任何非ASCII字符都会跨越多个字节进行分割,因此如果需要换行或截断文本以供显示,则必须考虑此问题。如果第7位已设置且第6位复位(字节为0x80-0xBF),则这是一个尾随字节,而如果位7和6被置位,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代码页。

1

您可能想查看icu。他们可能有可用的功能,使得使用UTF-8字符串更容易。

0

使用8位字符集(Windows上的CP1252,ISO 8859-1 aka Latin1 on * x),可以支持冰岛语,如法语,德语和西欧其他大多数语言。这是Unicode发明之前的标准方法,仍然很常见。正如你所说,你有一个约束,你不能重写你的应用程序使用wchar,而且你不需要。

你不应该对UTF-8导致问题感到惊讶; UTF-8将非ASCII字符(例如重音拉丁字符,刺,eth等)编码为每个双字节。

可以给出的唯一的一般建议是(理论上)很简单: (1)决定哪些字符集,你会支持(Unicode的,Latin1的,CP1252,...)在您的系统 (2 )如果您以某种其他方式(例如UTF-8)提供编码数据,然后将其转码为系统边界 (3)处的标准(例如CP1252),如果您需要提供以某种其他方式编码的数据。