如果输入类似于世界+你好
,我如何在C中执行这些UTF-8 unicode操作?:
+
字符,并将两部分中文字符放入两个单独的数组:str1 = 世界
和str2 = 你好
。汉字将从终端输入。
答案 0 :(得分:4)
关于UTF-8的一个好处是,如果你发现一个字节是一个有效的ASCII字符(特别是< 128),那个字节就是代表那个ASCII字符。因此,您可以在+字符处拆分,就好像您有一个单字节编码字符串一样。
您的案例中的比较也只是字节方式。当你不得不担心规范形式或区分大小写时会变得更加困难,但据我所知,这些都不适用于中文。 (当然,您可能会将不同的字符视为相同的字符,例如気和气。如果是这样,请先使用标准搜索和替换来规范化字符串。)
答案 1 :(得分:1)
我使用汉字多年,我不记得曾经“以UTF-8进行操作”。让我解释一下,UTF-8是编码的,它不应该在内存中用来做操作。当UTF-8被发明时,我们的想法是英语是重要的语言,我们需要其余部分,因此在UTF-8中,英文字符是一等公民,与中文不同。
正如“编码”一词所暗示的那样,您必须先解码数据才能使用它。它就像“对ZIP编码中的字符执行操作”。当然,如果将文件加载到缓冲区中,您可以对字符执行某些操作,但是您将以任何方式进行解码,要么解码整个缓冲区,然后执行操作,要么逐个字符地解码并在以下位置执行某些操作同时。
“解码”究竟是什么意思?通常,您将使用C类型unsigned short
或wchar_t
,或有时使用int
来保存每个字符。因此,您将UTF-8文本加载到char utf8buffer[]
缓冲区,然后将其解码到另一个缓冲区wchar_t utf16buffer[]
。然后你做任何你需要做的事情,然后你编码回UTF-8并保存到光盘。
正如你所看到的,UTF16足以应对中文:
L'一' == 0x4e00; // first Chinese character "yi" - "one"
L'龥' == 0x9fa9; // the last Chinese char that I know of.
// From 0xa000 the Korean alphabet (Hangul) starts.
但这仅适用于普通中国人,有少数罕见字符仅供学者在古代文献中使用,不适合0xFFFF范围。实际上中文“字母”并不固定,你可以将任何中国的“字根”和字符组合成一个新的字符。这不是固定的!甚至还有一个UNICODE实用程序,简称为表意描述序列“IDS”。但希望你根本不需要它。