如何以单个 ascii 字符的形式读取 unicode 字符串并以最快的方式检测它实际上是 unicode?
How to read a unicode string in form of individual ascii chars and detect that it was actually unicode in the fastest way possible?
我正在制作一个库,它允许用户将键值对作为 trie 数据结构进行插入和搜索。当我插入一个 unicode 字符串时,它会分解为 4 个字符 (utf-8)(这没问题),但每个字符都变成“?”。所以我尝试使用 setlocale(LC_ALL, "")
,但没有用(或者我只是不知道什么是适合我的案例的正确论据以及在哪里调用它)。我真的不关心按原样打印或阅读角色。我想要的只是它可以以某种方式唯一地表示。
在我的 trie 中有像 node *next[256]
.
这样的链接
所以我想要的是当一个 unicode 字符串被插入时,它被插入为一个唯一的组合,这使得可以唯一地搜索该字符串。
我还想要一种方法来检测一个 unicode 字符是否被分解为 4 个单独的字符。那是因为,例如,如果在字符串“wxyz”中,一个 unicode 字符“x”被分解为 a、b、c、d,那么 trie 将存储“wabcdyz”。但是如果我实际上是在搜索字符串 wabcdyz(不是 unicode) , 然后它会找到该字符串的条目,但这将是不匹配的。
这是一个显示 unicode 字符被分解为四个 ?
字符的程序:
#include <stdio.h>
int main()
{
printf("Hello World");
char a[] = "Ƃ";
int i;
for(i = 0 ; a[i] != '[=10=]' ; ++i)
{
printf("%c", a[i]);
}
return 0;
}
UTF-8 是一种将编码 Unicode 字符序列作为字节序列的机制,但不是唯一的方法。 Unicode 并不意味着 UTF-8,从技术上讲,UTF-8 也不意味着 Unicode。
When I insert a unicode string, it breaks down into 4 characters(utf-8)
这取决于您如何存储字符串数据,并且
- 听起来很破
- 可能不是使用UTF-8,与你的断言相反
So all I want is when a unicode string gets inserted, it gets inserted
as a unique combination which would make it possible to search that
string uniquely.
这相对容易:以相同的方式对所有字符串进行编码。我会选择将它们全部编码为 UTF-8,但您也可以使用任何其他支持可能出现在字符串中的所有字符的无状态编码,例如 UTF-16 或 UTF-32。但是你必须对所有字符串的所有字符使用一致的编码。
正确完成此操作后,您不一定需要执行任何其他特殊操作来使您的 trie 工作。* 但是,如果您选择 UTF-16 或 UTF-32 ,那么我建议围绕其代码单元的大小(分别为 16 位或 32 位)构建 trie。这不是必需的,但它可能会以更浅的形式产生优势,因此 better-performing 尝试。
* 但是请注意,UTF-16 和 UTF-32 代码单元包含许多值为 0 的包含字节,例如 0x0031 和 0x00000200。如果您确实将这些视为字节序列而不是 code-unit 序列,那么您必须考虑到这一点。特别是,您必须避免假设单个空字节用作终止符。
我正在制作一个库,它允许用户将键值对作为 trie 数据结构进行插入和搜索。当我插入一个 unicode 字符串时,它会分解为 4 个字符 (utf-8)(这没问题),但每个字符都变成“?”。所以我尝试使用 setlocale(LC_ALL, "")
,但没有用(或者我只是不知道什么是适合我的案例的正确论据以及在哪里调用它)。我真的不关心按原样打印或阅读角色。我想要的只是它可以以某种方式唯一地表示。
在我的 trie 中有像 node *next[256]
.
所以我想要的是当一个 unicode 字符串被插入时,它被插入为一个唯一的组合,这使得可以唯一地搜索该字符串。 我还想要一种方法来检测一个 unicode 字符是否被分解为 4 个单独的字符。那是因为,例如,如果在字符串“wxyz”中,一个 unicode 字符“x”被分解为 a、b、c、d,那么 trie 将存储“wabcdyz”。但是如果我实际上是在搜索字符串 wabcdyz(不是 unicode) , 然后它会找到该字符串的条目,但这将是不匹配的。
这是一个显示 unicode 字符被分解为四个 ?
字符的程序:
#include <stdio.h>
int main()
{
printf("Hello World");
char a[] = "Ƃ";
int i;
for(i = 0 ; a[i] != '[=10=]' ; ++i)
{
printf("%c", a[i]);
}
return 0;
}
UTF-8 是一种将编码 Unicode 字符序列作为字节序列的机制,但不是唯一的方法。 Unicode 并不意味着 UTF-8,从技术上讲,UTF-8 也不意味着 Unicode。
When I insert a unicode string, it breaks down into 4 characters(utf-8)
这取决于您如何存储字符串数据,并且
- 听起来很破
- 可能不是使用UTF-8,与你的断言相反
So all I want is when a unicode string gets inserted, it gets inserted as a unique combination which would make it possible to search that string uniquely.
这相对容易:以相同的方式对所有字符串进行编码。我会选择将它们全部编码为 UTF-8,但您也可以使用任何其他支持可能出现在字符串中的所有字符的无状态编码,例如 UTF-16 或 UTF-32。但是你必须对所有字符串的所有字符使用一致的编码。
正确完成此操作后,您不一定需要执行任何其他特殊操作来使您的 trie 工作。* 但是,如果您选择 UTF-16 或 UTF-32 ,那么我建议围绕其代码单元的大小(分别为 16 位或 32 位)构建 trie。这不是必需的,但它可能会以更浅的形式产生优势,因此 better-performing 尝试。
* 但是请注意,UTF-16 和 UTF-32 代码单元包含许多值为 0 的包含字节,例如 0x0031 和 0x00000200。如果您确实将这些视为字节序列而不是 code-unit 序列,那么您必须考虑到这一点。特别是,您必须避免假设单个空字节用作终止符。