【问题标题】:Windows UTF8 to UTF16Windows UTF8 到 UTF16
【发布时间】:2014-09-11 05:05:18
【问题描述】:

我一直在尝试使用 C++ 在带有 BOM 的 UTF8 和 UTF16 LE 之间进行转换,以使字符在 Windows 上正确输出,而无需更改终端的字体。

我尝试更改代码页,但没有成功。

我有 2 个问题,

  1. 如何将普通字符串转换为宽字符串?
  2. 创建一个将每个 unicode 字符映射到 Windows 代码页中的字符的 C++ 映射是不是一个坏主意?

例如,

wcout << L"\u00A0" << endl;

当使用代码页 850 时,此代码在 Windows 上输出字母 á。如何在 Windows 上将变量替换为 "\u00A0" 以将普通字符串转换为宽字符?

我想要的是这个:

wcout << Lsome_variable << endl;

我意识到这不是有效的 c++ 语法,但有人知道我该怎么做吗?或者有没有更好的方法?

【问题讨论】:

  • 一直使用宽字符串。 _setmode 用于标准流。
  • @Cheersandhth.-Alf:最好在任何地方使用 UTF-8,除了强制 UTF-16 的 WINAPI 调用。宽不宽! UTF-8 Everywhere Manifesto
  • @Deduplicator:由于windows平台上的主编译器visual c++不支持utf-8字面量,而且由于windows控制台子系统不支持utf-8输入,所以就傻了"到处使用 utf-8”。对不起。但就是这样
  • @Deduplicator:我认为你的热情论证的狂热从你的陈述中得到了很好的说明“你既没有链接到也没有提供任何论据来证明在所有情况下都会变得更好”,其中( 1) 忽略所提供的事实,以及 (2) 误导性地引入一个稻草人来反驳。这不是工程师的论点。这是一个狂热分子,或巨魔。

标签: c++ windows unicode utf-8


【解决方案1】:

如 cmets 中所述,标准库现在提供 std::wstring_convert 之类的内容(以及该页面的“另请参阅”部分中的其他函数/类)。

由于您使用的是 Windows,WinAPI 还具有转换功能。在这种情况下,您将寻找可用于从 UTF-8 转换为 UTF-16 的 MultiByteToWideChar

在这些选项之间,有些东西应该适合您的用例。一般来说,您永远不需要编写自己的转换图。

【讨论】:

猜你喜欢
  • 2017-09-04
  • 2014-11-29
  • 2013-03-28
  • 1970-01-01
  • 2020-10-04
  • 2011-12-03
  • 2012-02-13
  • 1970-01-01
  • 2016-07-29
相关资源
最近更新 更多