如何以单个ascii字符的形式读取unicode字符串,并以最快的方式检测它实际上是unicode?

如何以单个ascii字符的形式读取unicode字符串,并以最快的方式检测它实际上是unicode?,c,unicode,trie,C,Unicode,Trie,我正在制作一个库,它允许用户插入和搜索作为trie数据结构的键值对。当我插入unicode字符串时,它会分解为4个字符(utf-8)(这是可以的),但每个字符都会变成“?”。因此,我尝试使用setlocale(LC_ALL,”),但没有成功(或者我不知道我的案例的正确参数是什么,在哪里调用它)。我真的不在乎打印或阅读的字符,因为它是。我所希望的是,它可以以某种方式被唯一地表示出来 在my trie中有类似于node*next[256]的链接 所以我想要的就是当一个unicode字符串被插入时,它

我正在制作一个库,它允许用户插入和搜索作为trie数据结构的键值对。当我插入unicode字符串时,它会分解为4个字符(utf-8)(这是可以的),但每个字符都会变成“?”。因此,我尝试使用
setlocale(LC_ALL,”)
,但没有成功(或者我不知道我的案例的正确参数是什么,在哪里调用它)。我真的不在乎打印或阅读的字符,因为它是。我所希望的是,它可以以某种方式被唯一地表示出来

在my 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] != '\0' ; ++i)
    {
        printf("%c", a[i]);
    }

    return 0;
}
#包括
int main()
{
printf(“你好世界”);
字符a[]=“Ƃ”;
int i;
对于(i=0;a[i]!='\0';++i)
{
printf(“%c”,a[i]);
}
返回0;
}
UTF-8是一种将Unicode字符序列编码为字节序列的机制,但不是唯一的方式。Unicode并不意味着UTF-8,从技术上讲,UTF-8也不意味着Unicode

插入unicode字符串时,它会分解为4个字符(utf-8)

这是如何存储字符串数据的函数,以及

  • 听起来像坏了
  • 与您的断言相反,它可能没有使用UTF-8
所以我想要的就是当一个unicode字符串被插入时,它被插入 作为一个独特的组合,这将使搜索成为可能 字符串是唯一的

这相对简单:以相同的方式对所有字符串进行编码。我可以选择使用UTF-8对所有字符串进行编码,但您也可以使用支持字符串中可能出现的所有字符的任何其他无状态编码,例如UTF-16或UTF-32。但您必须对所有字符串的所有字符使用一致的编码

正确地做到这一点后,您不必做任何其他特殊的事情来使您的trie工作。*但是,如果您选择UTF-16或UTF-32,那么我建议围绕它们的代码单元大小(分别为16位或32位)来构造trie.这是没有必要的,但它可能会以更浅的形式产生优势,因此表现更好



*但是,请注意,UTF-16和UTF-32代码单元包括许多包含值为0的字节,例如0x0031和0x00000200。如果确实将它们视为字节序列而不是代码单元序列,则必须对此进行说明。特别是,必须避免假设单个空字节用作终止符。

@IgorGalczak UTF-8 ch字符可以是1到4个字节(如果您尊重Unicode对0x10FFFF代码点的人为限制),也可以是1到6个字节(如果您坚持UTF-8的原始定义)。我怀疑OP实际上得到的是UTF-16或-32。@Mihir根据设计,UTF-8多字节序列的每个字节都有它的高位集,因此它们永远不会与ASCII字符冲突。只要您的trie结构不与高位冲突,它就应该能够像处理ASCII一样处理UTF-8字符串,而不必知道编码但是,如果您的Unicode字符串始终每个字符有四个字节,那么它们可能不是UTF-8,而是UTF-32,这更难处理。请告诉我们其中一个问题字符中四个字节的数值是多少。“Unicode字符串”?在C中,您有一个编码。因此您的意思是“UTF-8”“?或者你像python一样使用unicode接口处理(和隐藏)细节?@Mihir,我注意到你说的是“unicode”,但标记[utf-8],描述的行为似乎与utf-8不一致。utf-8是表示unicode文本的一种方式,但不是唯一的方式。@Mihir有两个问题:(1)你的测试程序为什么使用
int a[]=“Ƃ”
?这绝对是错误的。它甚至不能在我的计算机上编译如果您在
printf
调用中将
%c
更改为
%02x
,您的程序在您的计算机上打印什么?这回答了我的大部分问题。但我甚至应该如何启用utf-8?例如,我将Ƃ作为字符串传递以插入。当我逐字符遍历字符串字符时,它会将其读取为“?”?”。如何我能让它读对吗?@Mihir在你告诉我们这四个字节中每个字节的数值之前,我们真的帮不了你什么忙。我现在可以告诉你,用UTF-8编码的
Ƃ
,应该会产生两个字节的序列0xC6 0x82,因此实际上可以肯定你没有得到UTF-8,但我仍然不知道是什么如果您向我们展示了您所说的“我将Ƃ作为字符串传递以插入”的确切代码结构,这也会有所帮助@JohnBollinger您可能还应该提到UTF-16和-32与使用C的单字节
\0
字符串终止符不兼容;您可以使用U+0000,但是您必须使用代码单位而不是字节。@Mihir哦,我们还需要知道您是否在使用Windows。
setlocale
的答案是ues的变化取决于此。@Mihir我已将您的程序复制到您的问题中。以后,请通过编辑问题而不是使用pastebin提供示例代码;我们希望问题和答案在几年后有意义,如果