从Windows MBCS转换为UTF-8

时间:2017-07-24 22:05:41

标签: unicode visual-studio-2015 utf-8 mbcs

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

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

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

2 个答案:

答案 0 :(得分:0)

Oracle提供very detailed page讨论该主题。 (在页面上搜索:CP1252,所有'字符集'都列在底部。)

MBCS代表:多字节字符集。

cp-1252 不是 MBCS
cp-1252包含ASCII char-set(128个符号),扩展了128个符号:256个符号,每个符号1个字节编码。

由于MBCS每个符号可以容纳1或2个字节,因此它包含cp-1252(256个1字节符号),但它包含的符号比cp-1252多得多。
有关Unicode and MBCS的信息,请参阅Microsoft。

如果您安装了python,则可以在文件your_path_to\Python27\Lib\encodings\cp1252.py内清楚地看到它:从0x000xFF:每个符号一个字节(2 * 4位),256个符号。

关于国际化,微软有帮助吗?

答案 1 :(得分:0)

UTF-8是用于对数据进行编码的不错选择。在Windows上对它的支持越来越好,但您仍然希望将UTF-8字符串转换为wchar_t的字符串(即Windows上的UTF-16),以便将它们与Windows API一起使用。 (Windows中使用CP 65001在控制台上读取和编写UTF-8的支持有限,但您的应用可能不是控制台模式。)您可以使用<codecvt>std::codecvt_utf8或{{std::codecvt_utf8_utf16执行此操作。 1}}),Boost中的widen()narrow(),C中的mbstowcs()或ICU或QT等其他各种库。

Windows上的UTF-8支持似乎正在改进。最新的Windows 10SR4中甚至还有".utf8"".utf-8"区域设置。如果必须在旧版本上运行,您可能仍然无法在应用程序中长时间使用UTF-8语言环境。

您还需要能够将旧数据转换为UTF-8,但相同的库也可以处理它。例如,您可以从初始化为保存数据的代码页的codecvt对象获取std::locale方面。或者只使用查找表。

没有太多理由将数据保存在除UTF-8之外的任何内容中。 UTF-16占用更多空间,甚至不是固定宽度编码,在字节顺序方面存在问题,并且在其他地方没有广泛使用。