Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将重音字母(wchar_t)转换为字符?_C++_Unicode_Wchar T - Fatal编程技术网

C++ 如何将重音字母(wchar_t)转换为字符?

C++ 如何将重音字母(wchar_t)转换为字符?,c++,unicode,wchar-t,C++,Unicode,Wchar T,我将一个应用程序从Windows移植到Linux,在字符编码方面遇到了一个问题:我看到重音字母(例如“é”?)被认为是wchar\u t(g++为4个字节),而在Visual Studio中,它们是1个字节(char)。我的单元测试失败了,因为在我的代码中,我使用重音字母进行字符比较(在Linux中,它们是多字节的) 是否可以在Linux中向Windows编码(1字节)投射重音字母(如“ā”),或者我应该重构代码并改用std::wstring?如果'é'可以存储在Windows上的一个字符上,那

我将一个应用程序从Windows移植到Linux,在字符编码方面遇到了一个问题:我看到重音字母(例如“é”?)被认为是
wchar\u t
(g++为4个字节),而在Visual Studio中,它们是1个字节(char)。我的单元测试失败了,因为在我的代码中,我使用重音字母进行字符比较(在Linux中,它们是多字节的)


是否可以在Linux中向Windows编码(1字节)投射重音字母(如“ā”),或者我应该重构代码并改用
std::wstring

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

使用linux上常见的utf-8编码。这将导致编译器发出警告。如果您使用获得的字符,它将只表示编码的一部分,因此逐字符比较将毫无意义

如果您想使用字符串中的单个字符保留算法,则最好使用
wchar\u t
wstring
(或更便于移植的事件:
char32\u t
u32string


<>如果你想了解更多关于字符编码和Unicode的C++,我只能热情地推荐你James McNellis的优秀视频。p>
wchar\u t
在Windows上是2个字节(UTF-16),在其他系统上是4个字节(UTF-32)。如果数据实际上使用的是1字节字符,那么它使用的是
char
,因此需要接受charset代码页处理。要将其移植到Linux,您应该将数据重新编码为UTF编码(8、16或32),然后使用可移植的Unicode比较。在我的Windows系统上,带法语重音的字母大小是一个字节(char),这就是为什么在我的代码中我能够在字符比较中使用它们(例如if(strMystring[I]='é')…)Linux文本编辑器破坏了原始编码,现在我的单元测试失败了,因此我不得不找到一个合适的便携式解决方案。
if(strMystring[I]='é')
只有在
strMystring
是拉丁编码的8位字符串,并且源文件本身是拉丁编码的以匹配时才会起作用。这不是一个非常便携的设置。我绝对不建议使用窄字符串比较非ASCII数据,因为这是特定于语言环境的,除非您使用UTF-8。使用宽字符串。是的,你需要重构你的代码。发明宽字符是有原因的,因为8位字符实际上只适用于ASCII。即使其他角色似乎可以工作,但它们在其他系统上,即使是不同版本的Windows上,也不会工作!由于Ubuntu下的sizeof('é')=4,Windows下的sizeof('é')=1,我如何编写一个可移植的解决方案来执行字符比较,比如if(strMystring[I]='é'))