如何在C中对中文字符(UTF-8)执行操作?

时间:2013-11-25 09:38:16

标签: c algorithm data-structures unicode utf-8

如果输入类似于世界+你好,我如何在C中执行这些UTF-8 unicode操作?:

  1. 将字符串拆分为+字符,并将两部分中文字符放入两个单独的数组:str1 = 世界str2 = 你好
  2. 比较两个数组以查看中文字符是否相同。
  3. 汉字将从终端输入。

2 个答案:

答案 0 :(得分:4)

关于UTF-8的一个好处是,如果你发现一个字节是一个有效的ASCII字符(特别是< 128),那个字节就是代表那个ASCII字符。因此,您可以在+字符处拆分,就好像您有一个单字节编码字符串一样。

您的案例中的比较也只是字节方式。当你不得不担心规范形式或区分大小写时会变得更加困难,但据我所知,这些都不适用于中文。 (当然,您可能会将不同的字符视为相同的字符,例如気和气。如果是这样,请先使用标准搜索和替换来规范化字符串。)

答案 1 :(得分:1)

我使用汉字多年,我不记得曾经“以UTF-8进行操作”。让我解释一下,UTF-8是编码的,它不应该在内存中用来做操作。当UTF-8被发明时,我们的想法是英语是重要的语言,我们需要其余部分,因此在UTF-8中,英文字符是一等公民,与中文不同。

正如“编码”一词所暗示的那样,您必须先解码数据才能使用它。它就像“对ZIP编码中的字符执行操作”。当然,如果将文件加载到缓冲区中,您可以对字符执行某些操作,但是您将以任何方式进行解码,要么解码整个缓冲区,然后执行操作,要么逐个字符地解码并在以下位置执行某些操作同时。

“解码”究竟是什么意思?通常,您将使用C类型unsigned shortwchar_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”。但希望你根本不需要它。