Unicode 从Windows MBCS转换为UTF-8

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,如果我们能够帮助的话,我们必须修改每个源文件的编码方式 使用这些外来字符的唯一方法是用户在字段(如名称)中输入它们。然后,包含这些字符的字符串会根据需要保存

我有一个非常大(数百万行)的应用程序,它是使用MBCS(代码页1252)开发的,并且假设所有字符串都是char*,每个字符只有一个字节。我们现在正在扩展我们的语言集,需要转向Unicode。由于UTF-8以1字节的增量工作,因此这似乎非常适合。按照惯例,我们希望以最少的代码更改进行此更改。我们不希望将所有内容都更改为wchar或_TCHAR,如果我们能够帮助的话,我们必须修改每个源文件的编码方式

使用这些外来字符的唯一方法是用户在字段(如名称)中输入它们。然后,包含这些字符的字符串会根据需要保存到文件中,并且不会被操作。稍后将读取文件并显示内容。假设源代码中没有使用cp1252以外的字符(如中文字符等),我们是否需要对大部分源代码进行任何更改,或者我们是否可以将其保留为char*,让可能的多字节字符通过系统,直到它们到达显示它们的UI

该应用程序是在Visual Studio 2015上使用MFC开发的。

Oracle提供了一个关于该主题的讨论。(搜索:
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
,则情况并非如此。