我有一个非常大(数百万行)的应用程序,它是使用MBCS (代码页1252)开发的,并假设所有字符串都是char*,每个字符只有一个字节。我们现在正在扩展我们的语言集,需要迁移到Unicode。由于UTF-8以1字节为增量工作,因此这似乎是一个很好的选择。按照惯例,我们希望以最少的代码更改进行此更改。我们不想把所有的东西都改成wchar或_TCHAR,如果可以的话,我们必须修改每个源文件的编码方式。
使用这些外来字符的唯一方式是用户在字段中输入它们,例如名称。然后,包含这些字符的字符串将根据需要保存到文件中,并且不会被处理。稍后将读取文件并显示内容。假设在源代码中没有使用cp1252之外的字符(即中文字符等),我们是否需要对大部分源代码进行任何更改,或者我们是否可以将其保留为char*,让可能的多字节字符通过系统,直到它们到达显示它们的UI?
该应用程序是在Visual Studio 2015上使用MFC开发的。
发布于 2018-05-20 11:29:48
UTF-8是一个很好的选择,可以用来对数据进行编码。在Windows上对它的支持正在变得越来越好,但是为了在Windows API中使用它们,您仍然需要将UTF-8字符串转换为wchar_t字符串(也就是Windows上的UTF-16 )。( Windows对使用CP 65001的控制台读取和写入UTF-8的支持有限,但您的应用程序可能不是控制台模式。)您可以使用<codecvt> (std::codecvt_utf8或std::codecvt_utf8_utf16)、Boost中的widen()和narrow()、C中的mbstowcs()或各种其他库(如ICU或QT )来完成此任务。
Windows对UTF-8的支持似乎正在改善。在最新的Windows10SR4中甚至有一个".utf8"或".utf-8"语言环境。如果您的应用程序必须在旧版本上运行,那么您可能在很长一段时间内都不能在应用程序中使用UTF-8语言环境。
您还需要能够将遗留数据转换为UTF-8,但相同的库也可以处理这一问题。例如,您可以从std::locale对象中获取一个codecvt facet,该对象被初始化为保存数据的代码页。或者只使用查找表。
除了UTF-8之外,没有太多理由将数据保存为其他格式。UTF-16占用了更多的空间,它甚至不是固定宽度的编码,在字节顺序方面有问题,并且在其他地方没有得到广泛的使用。
发布于 2018-05-20 06:44:35
Oracle提供了一个关于这个话题的very detailed page。(搜索:CP1252在页面的底部列出了所有的“字符集”。)
MBCS代表:多字节字符集。
cp-1252 is not MBCS:
cp-1252包含ASCII char-set (128个符号),扩展了128个符号: 256个符号,每个符号编码1个字节。
由于MBCS可以为每个符号保留1或2个字节,因此它包含cp-1252 (256个1字节的符号),但它可以容纳比cp-1252多得多的符号。
参见微软,关于Unicode and MBCS。
如果您安装了python,那么在文件your_path_to\Python27\Lib\encodings\cp1252.py中您可以清楚地看到:从0x00到0xFF:每个符号一个字节(2 *4位),256个符号。
关于国际化,微软有帮助吗?
https://stackoverflow.com/questions/45290833
复制相似问题