使用 wchar_t 处理 unicode 字符好吗?它不会引起任何问题吗?

Is handling unicode character with wchar_t good? Does it not cause any problems?

我一直在寻找一种处理波兰语单词的方法。我阅读了有关 utf8、16、32 的信息,但是从 charutf 的任何转换都会给我不同的字母。

不过,

wchar_t 给出了正确的字母。

这样可以吗?

例如,如果我只使用 ascii,性能如何?它会以任何方式影响应用程序吗?

你混淆了两个不同的东西:

  1. 存储空间

    如何存储组成文本字符串的字节。那会在 char (单字节)值的数组中吗?还是会采用 wchar_t(多字节)值的形式?

  2. 编码

    您的计算机(和您!)需要知道如何处理这些字节中的值。他们的意思是什么?无论存储方式如何,它们可以是 ASCII、一些 code page、UTF-8、UTF-16、UTF-32、Klingon 等等。

通常,由于历史原因,我们选择 char 用于单字节编码(例如 ASCII)和 UTF-8,而 wchar_t 用于 UTF -16(特别是在 Windows 上,它有 16 位 wchar_ts 并且通常在其整个 API 中采用这种组合——请注意,它不准确地将其简单地称为 "Unicode")。

性能并没有真正发挥作用,但如果您选择 一个 并坚持使用它(并使用存储机制),您将节省在不同编码之间转换的时间和精力适合您正在使用的字符串库)。有时您的 OS 将有助于确定该选择,但我们无法告诉您它会是什么。

同样,您关于 "works" 和 "doesn't work" 的陈述非常模糊,很可能是错误的。

我们无法在不知道您的项目要求、它将 运行 用于何种计算机以及采用何种技术的情况下说 "ok" 是什么。不过,我会做一个巨大的概括:在过去,您可能使用过 Mazovia encoding,一个包含波兰语字符的更改代码页;如今,您可能希望尽可能轻松地实现可移植性和互换性(因为为什么不呢?!),因此我们鼓励您坚持使用 UTF-16 而不是 wchar_t on Windows,以及 UTF- 8 超过 char 否则。

(从 C++20 开始,我们还将有 char8_t,一种专门设计用于表示它存储 UTF-8 编码数据的存储机制;但是,它将是在你看到它被广泛使用之前的某个时间,如果有的话。你可以在 cppreference.com's article about "Fundamental types")

上阅读更多关于 C++ 的字符类型