【问题标题】:Converting from Windows MBCS to UTF-8从 Windows MBCS 转换为 UTF-8
【发布时间】:2017-07-24 22:05:41
【问题描述】:

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

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

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

【问题讨论】:

  • Win32 API(大部分)不支持 UTF-8。因此,即使您决定在内存中的字符串中使用 UTF-8,在将它们传递给/从 Win32 API 函数传递时,您也必须在运行时将它们在 UTF-16 之间转换。而且您将不得不使用基于 Unicode 的 UI。这将比一开始在任何地方都使用 Unicode 字符串进行更大的代码更改。如果您使用基于TCHARTCHAR 的API,那么最少 量的代码更改已经完成,但如果您直接使用char,则情况并非如此。

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


【解决方案1】:

UTF-8 是用于对您的数据进行编码的不错选择。 Windows 上对它的支持越来越好,但您仍然希望将 UTF-8 字符串与 wchar_t(即 Windows 上的 UTF-16)字符串相互转换,以便将它们与 Windows API 一起使用。 (Windows 对使用 CP 65001 的控制台读取和写入 UTF-8 的支持有限,但您的应用程序可能不是控制台模式。)您可以使用 <codecvt>std::codecvt_utf8std::codecvt_utf8_utf16)、@ Boost 中的 987654325@ 和 narrow(),C 中的 mbstowcs() 或各种其他库,例如 ICU 或 QT。

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

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

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

【讨论】:

    【解决方案2】:

    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 多得多。
    请参阅 Microsoft,关于 Unicode and MBCS

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

    关于国际化,微软帮忙?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      相关资源
      最近更新 更多