是以字符*表示的UTF-8;字符串是否足以支持所有语言?

是以字符*表示的UTF-8;字符串是否足以支持所有语言?,utf-8,utf-16,Utf 8,Utf 16,我打算创建一个处理字符串的库,但我想到的第一件事是支持所有语言,在这些语言中,包括亚洲语言,如汉语、日语和从右到左的语言,如阿拉伯语、波斯语等等 所以,我想知道数据类型char*和std::string中表示的“UTF-8”是否足以支持所有的读写语言,或者我应该使用数据类型wchar\u t*和std::wstring中表示的“UTF-16” 简言之,无论是这些数据类型还是其他数据类型,应该使用哪种数据类型并适合此任务?不,UTF-8还不足以支持所有语言(目前)。从 洛马 纳西东巴(摩梭)

我打算创建一个处理字符串的库,但我想到的第一件事是支持所有语言,在这些语言中,包括亚洲语言,如汉语、日语和从右到左的语言,如阿拉伯语、波斯语等等

所以,我想知道数据类型
char*
std::string
中表示的“UTF-8”是否足以支持所有的读写语言,或者我应该使用数据类型
wchar\u t*
std::wstring
中表示的“UTF-16”


简言之,无论是这些数据类型还是其他数据类型,应该使用哪种数据类型并适合此任务?

不,UTF-8还不足以支持所有语言(目前)。从

  • 洛马
  • 纳西东巴(摩梭)

当前不受支持。

您的问题中存在一些困惑,因此我将从您可能正在寻找的答案开始,然后从这里开始:

你应该用UTF-8编码,除非你有很好的理由不用UTF-8编码。有几个很好的理由,但都与支持什么语言无关

UTF-8和UTF-16只是编码Unicode的不同方式。您还可以在UTF-32中编码Unicode。您甚至可以在GB18030中对Unicode编码,或几种其他编码之一。只要编码能够处理所有Unicode代码点,那么它将覆盖相同数量的语言、字形、脚本、字符等(准确地确定Unicode代码点的含义本身就是一个微妙的主题,我不想在这里深入讨论,但出于这些目的,让我们将其视为“字符”)

您通常应该使用UTF-8,因为如果您使用基于拉丁语的脚本,UTF-8非常高效,而且它是该生态系统中最受支持的编码。也就是说,对于某些问题,UTF-16或UTF-32可能更有效。但如果没有具体原因,您应该使用UTF-8

数据类型
char*
std::string
不代表UTF-8。它们表示一个字符序列。这就是他们所代表的一切。
char
序列可以用多种方式解释。将其解释为UTF-8是相当常见的,但我甚至不认为这是最常见的解释(许多系统将其视为扩展ASCII,这就是为什么非英语文本在系统之间移动时经常会出现乱码的原因)

如果您想在UTF-8中工作,通常需要做的不仅仅是使用
std:string
。您需要一个UTF-8处理库,最常见的是
std::locale
,用于简单的使用或更复杂的问题。UTF-8字符的长度可以在1到4个字符之间,因此在应用字符处理时必须非常仔细。最常见的错误是UTF-8不支持随机访问。你不能直接跳到字符串中的第32个字母。你必须从一开始就进行处理,以找到所有的角色打断。如果在随机点开始处理UTF-8字符串,可能会跳入字符的中间


通过组合字符,UTF-8编码可以(在许多系统中)任意长。视觉上的单个“角色”这不是一个C++问题,而是一个UTF-8问题,C++的情况很有趣,这是个好问题。不,如果您关心Unicode,就不应该使用宽类型。C++11引入了应该使用的类型,而不是宽类型,例如
u16string
char16\u t
。UTF8只获取了字符串文本,存储在
char
string
中,应该将其视为字节数组。在C++20中引入了
char8\u t
类型,但没有流支持UTF8和UTF16只是unicode编码。所有Unicode码点都可以用UTF8、UTF16和UTF32表示。但是你在干什么?“支持所有语言”需要的不仅仅是代码点。您需要一个Unicode标准/表(unicodes代码点的属性、排序/排序、规范化等)。其中很大一部分是由字体完成的(如果您需要以任何语言显示字符串)。所以我的建议是:寻找一个Unicode库(带有本地化/国际化的版本),看看它们使用什么字符串类型。如果脚本不是Unicode的,那么UTF-16或UTF-32也不支持它。在这种情况下,您可能需要私用字符,或者需要对Unicode支持的脚本进行音译。@dan04我说过了吗?OP询问UTF-8是否支持所有语言。我的回答是否定的,以下是它没有的。@NathanOliver但dan04有一点:OP询问是否使用UTF-8或UTF-16,基于哪种语言支持最多,任何答案都应该首先指出这方面没有区别。