1

这里plain string有一种编码:

  • 一个普通的字符串文字,例如"plainstring"编码为;

  • 所有标准库都返回或接受。例如:</p>


std::cout << "I'm ok." ; // plain string, ok on my system,
                            // VS2015 x64 default encoding setting.
std::cout << u8"I'm wrong."; // got error display on my system

std::experimental::filesystem::path path("Some Right specified Path contains non-ASCII chars"); // ok

std::experimental::filesystem::path path2(u8"Some Path specified Path contains non-ASCII chars"); // error

std::experimental::filesystem::directory_iterator r(path); // ok

std::experimental::filesystem::directory_iterator r2(path2); // will throw exception

据我所知,我的系统(Windows 10 x64)GB2312对这种纯字符串使用编码。

但是如何将它们转换为(并转换回)其他编码,例如以utf-8独立于平台的方式?

4

1 回答 1

0

这是一个看似简单的问题,但实际上是一个极其复杂的问题。

简短的回答:从 GB2312 到 UTF-8 再回到 GB2312 的往返是可能的,但是您不能进行从 UTF-8 到 GB2312 然后再回到 UTF-8 的往返转换。

更长的答案:任何可以以符合标准的方式表示的字符串都可以用 Unicode 表示,任何可以用 Unicode 表示的字符串都可以用 UTF-8 编码。

反之则不成立。无法将任意 Unicode 字符串转换为任何其他(标准)编码。

Unicode 包含 1,114,112 个代码点。表示这么多不同的点至少需要三个字节。UTF-8 可以表示这些代码点中的任何一个。

GB2312(AKA简体中文)包含6000+个码位,所以有很多Unicode码位在GB2312中没有对应的条目。这就是为什么 UTF-8 到 GB3213 编码总是有损的。所以理论上往返转换是不可能的。

话虽如此,从 UTF-8 到 GB2312 存在“尽力而为”的转换器,并且没有理由不让它们独立于平台。谷歌搜索UTF-8 to GB2312 conversion发现许多可能性,其中大部分不依赖于任何特定平台。

我建议您进行此搜索并选择满足您需求的结果。

在编码之间进行转换的一种独立于平台的解决方案是boost.locale对它可以为您做的事情的完整解释超出了 Stack Overflow 答案中的内容<幽默>即使我使用了边距。</幽默>。

补充阅读:此页面提供了有助于理解字符串编码问题的背景信息

于 2017-01-20T15:55:53.340 回答