【问题标题】:Converting C-Strings from Local Encoding to UTF8将 C 字符串从本地编码转换为 UTF8
【发布时间】:2009-12-27 01:43:43
【问题描述】:

我正在编写一个小型应用程序,在其中我从控制台读取一些文本,然后将其存储在经典的 char* 字符串中。
碰巧我需要将它传递给一个只需要 UTF-8 编码字符串的库。由于 Windows 控制台使用本地编码,我需要将本地编码转换为 UTF-8。
如果我没记错的话,我可以使用 MultiByteToWideChar(..) 编码为 UTF-16,然后使用 WideCharToMultiByte(..) 转换为 UTF-8。

但是我想知道是否有一种方法可以在不使用任何外部库的情况下直接从本地编码转换为 UTF-8,因为转换为 wchar 的想法只是为了能够转换回 char(utf-8 编码但仍然)对我来说似乎有点奇怪。

【问题讨论】:

    标签: c++ windows visual-studio unicode visual-c++


    【解决方案1】:

    从 UTF-16 转换为 UTF-8 纯粹是一个机械过程,但从本地编码转换为 UTF-16 或 UTF-8 需要一些大型的专用查找表。 c-runtime 只是转身,为非平凡的情况调用 WideCharToMultiByte 和 MultiByteToWideChar。

    至于必须使用 UTF-16 作为中间阶段,据我所知,没有办法解决这个问题 - 抱歉。

    由于您已经链接到外部库以获取文件输入,您不妨链接到同一个库以获取 WideCharToMultiByte 和 MultiByteToWideChar。

    使用 c-runtime 将使您的代码可重新编译到其他操作系统(理论上),但它也会在您和在这种情况下执行所有实际工作的库 - kernel32 之间增加一层开销。 dll。

    【讨论】:

    • 能够直接执行此操作只是一种方便。如果我必须为 UTF16-String 分配内存并对 2 个函数调用进行错误检查,而不是仅仅调用一个函数并检查它是否有错误,这在我看来确实会有所不同。我想这就是你在尝试保持 unicode 兼容时必须付出的代价:)
    【解决方案2】:

    POSIX 世界为此喜欢 iconv 库。它使用 char* 在几乎所有编码之间进行转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多