2016-12-19 39 views
1

我将应用程序从Windows移植到Linux,并且遇到了字符编码的问题:我看到重音字母(例如'é''à')被认为是wchar_t(4个字节,带有g ++),而在Visual Studio中, 1个字节(char)。我的单元测试失败了,因为在我的代码中我使用重音字母进行字符比较(如在Linux中它们是多字节)。如何将重音字母(wchar_t)转换为char?

是否可以在Linux中将重音字母(如'û')转换为Windows编码(1字节),还是应该重构我的代码并使用std::wstring代替?

+2

'wchar_t'在Windows上是2个字节(UTF-16),在其他系统上是4个字节(UTF-32)。如果数据确实使用1个字节的字符,那么它使用'char'来代替,因此需要处理字符集代码页。要将其移植到Linux,您应该将数据重新编码为UTF编码(8,16或32),然后使用便携式Unicode比较。 –

+0

法语重音字母大小是我的Windows系统上的一个字节(char),这就是为什么在我的代码中我可以在字符比较中使用它们(例如if(strMystring [i] =='é')...)Linux文本编辑器与原始编码混淆,现在我的单元测试失败了,所以我有义务找到合适的便携式解决方案。 – Aminos

+2

'如果(strMystring [i] =='é')'只有在'strMystring'是一个拉丁编码的8位字符串并且源文件本身以拉丁编码匹配时才起作用。这不是一个非常便携的设置。我绝对不建议使用窄字符串比较非ASCII数据,因为这是特定于语言环境的,除非您使用的是UTF-8。改用宽字符串。 –

回答

1

如果'é'可以存储在Windows上的一个字符上,那么您的应用程序可能编译时没有UNICODE,当然编码也是Win 1252

随着Linux上通常的utf-8编码,'é' should require 2 characters。这应该会导致编译器的警告。如果你使用获得的字符,它将只代表编码的一部分,所以char by char比较将是没有意义的。

如果你想让你的算法,使用字符串的单个字符,你最好与wchar_twstring(或事件更便携:char32_tu32string)工作。

如果您想了解更多关于字符编码和unicode的C++,我只能热烈推荐James McNellis出色的视频tutorial on unicode with C++