Unicode 从Windows MBCS转换为UTF-8
我有一个非常大(数百万行)的应用程序,它是使用MBCS(代码页1252)开发的,并且假设所有字符串都是char*,每个字符只有一个字节。我们现在正在扩展我们的语言集,需要转向Unicode。由于UTF-8以1字节的增量工作,因此这似乎非常适合。按照惯例,我们希望以最少的代码更改进行此更改。我们不希望将所有内容都更改为wchar或_TCHAR,如果我们能够帮助的话,我们必须修改每个源文件的编码方式 使用这些外来字符的唯一方法是用户在字段(如名称)中输入它们。然后,包含这些字符的字符串会根据需要保存到文件中,并且不会被操作。稍后将读取文件并显示内容。假设源代码中没有使用cp1252以外的字符(如中文字符等),我们是否需要对大部分源代码进行任何更改,或者我们是否可以将其保留为char*,让可能的多字节字符通过系统,直到它们到达显示它们的UI 该应用程序是在Visual Studio 2015上使用MFC开发的。Oracle提供了一个关于该主题的讨论。(搜索:Unicode 从Windows MBCS转换为UTF-8,unicode,visual-studio-2015,utf-8,mbcs,Unicode,Visual Studio 2015,Utf 8,Mbcs,我有一个非常大(数百万行)的应用程序,它是使用MBCS(代码页1252)开发的,并且假设所有字符串都是char*,每个字符只有一个字节。我们现在正在扩展我们的语言集,需要转向Unicode。由于UTF-8以1字节的增量工作,因此这似乎非常适合。按照惯例,我们希望以最少的代码更改进行此更改。我们不希望将所有内容都更改为wchar或_TCHAR,如果我们能够帮助的话,我们必须修改每个源文件的编码方式 使用这些外来字符的唯一方法是用户在字段(如名称)中输入它们。然后,包含这些字符的字符串会根据需要保存
CP1252
在页面的底部列出了所有“字符集”。)
MBCS
代表:多字节字符集
cp-1252
不是MBCS
:cp-1252
包含ASCII字符集(128个符号),扩展为128个符号:256个符号,每个符号按1字节编码
由于MBCS
每个符号可容纳1或2个字节,因此它包括cp-1252
(256个1字节符号),但它容纳的符号比cp-1252
多得多
请参阅Microsoft,关于
如果安装了python,那么在文件到\Python27\Lib\encodings\cp1252.py的路径中,您可以清楚地看到它:从0x00
到0xFF
:每个符号一个字节(2*4位),256个符号
关于国际化,微软有帮助吗 UTF-8是一个很好的选择,可以用来编码未来的数据。Windows上对它的支持越来越好,但您仍然希望将UTF-8字符串转换为wchar\u t
(即Windows上的UTF-16)字符串,并将其与Windows API一起使用。(Windows对使用CP 65001的控制台读写UTF-8的支持有限,但您的应用程序可能不是控制台模式。)您可以使用Boost中的
(std::codevt_utf8
或std::codevt_utf8_utf16
)、加宽()
和窄化()
,C中的mbstowcs()
,或其他各种库,如ICU或QT
Windows上的UTF-8支持似乎正在改进。在最新的Windows10SR4中甚至有一个“.utf8”
或“.utf-8”
区域设置。如果应用程序必须在旧版本上运行,那么在很长一段时间内,您可能仍然无法在应用程序中使用UTF-8语言环境
您还需要能够将遗留数据转换为UTF-8,但相同的库也可以处理这一点。例如,您可以从初始化为数据保存所在的代码页的std::locale
对象获取codevt
方面。或者只使用查找表
除了UTF-8之外,没有太多理由将数据保存在任何东西中。UTF-16占用更多空间,它甚至不是固定宽度编码,在端性方面有问题,在其他地方也没有得到广泛使用。Win32 API(大部分)不支持UTF-8。因此,即使您决定在内存字符串中使用UTF-8,在运行时向Win32 API函数传递UTF-16或从Win32 API函数传递UTF-8时,也必须在UTF-16之间进行转换。您必须使用基于Unicode的UI。这将是一个比在任何地方使用Unicode字符串都要大得多的代码更改。如果您使用的是基于TCHAR
和TCHAR
的API,那么代码更改量将达到最小,但如果您直接使用char
,则情况并非如此。