各位大侠: 在linux下如何用C实现汉字转unicode码。比如:“中国”转成“5E5D 66EF”,在线等~~

各位大侠: 在linux下如何用C实现汉字转unicode码。比如:“中国”转成“5E5D 66EF”,在线等~~,第1张

/* Copyright (C) 2010 by Xingyou Chen [email protected]>

*

* Test OS is Debian squeese AMD64 , source file stored in UTF-8

* If another encoding is used, this program may fail

*/

#include <stdio.h>/* printf() from here */

int main()

{

int i = 0/* for loop */

char orig[6] = "中国"/* demo text, Chinese char is 3 byte long */

unsigned short dest[2]/* two 2-byte variable */

for(i = 0i <2i++)

{ /* Don't understand? See UTF-8 and Unicode encoding */

dest[i] = (orig[3*i] &0x1F) <<12

dest[i] |= (orig[3*i + 1] &0x3F) <<6

dest[i] |= (orig[3*i + 2] &0x3F)

printf("%x", dest[i])

}

printf("\n")

return 0

}

====================================================

“中国”: UTF-8e4b8ad e59bbd Unicode 4e2d 56fd

你给出的那个编码该是不正确的。这里只做了UTF-8到UCS-2的转换,

中文编码不少,没功夫全写出来(也写不全),UTF-8是我平时用的。

在开源环境中,这个根本不是问题,可以参考zh-autoconvert的源代码:

http://ftp.de.debian.org/debian/pool/main/z/zh-autoconvert/zh-autoconvert_0.3.16.orig.tar.gz

它提供了多种中文编码间相互转换的C语言代码,找你需要的吧。

在讨论 Unicode 的时候,我们不得不提及 ASCII 码。

从它的名字中我们可以了解这是美国人定义的标准,迄今为止一共定义了 128 个字符,主要支持英文字母的编码,而没有考虑到其它国家的语言,比如我国的汉字。所以,为了解决传统字符编码方案的局限诞生了 Unicode。

Unicode 为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

Unicode 虽然解决了 ASCII 码的兼容性问题,但是它又带来了新的问题。ASCII 只需要 1 个字节就能解决英文世界的字符编码,而 Unicode 为了支持多语言,最多需求 4 个字节的编码空间。也就是说,一篇纯英文文章以 Unicode 编码存储在计算机中所消耗的内存是要大于以 ASCII 编码进行存储的,这不就造成内存资源的浪费了吗?所以这就有了 UTF-8。

UTF-8(8-bit Unicode Transformation Format)是一种针对 Unicode 的可变长度实现方式。准确来的说,UTF-8 并不是一种编码方式,什么是编码方式?我们上面提到的 ASCII 和 Unicode 就是编码方式,而 UTF-8 是 Unicode 的其中一种实现方式。实现方式不同于编码方式,一个字符的 Unicode 编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及处于节省空间的目的,对 Unicode 编码的实现方式有所不同。Unicode 的实现方式称为 Unicode 转换格式 (Unicode Transformation Format,简称为 UTF)。Unicode 的实现方式还包括 UTF-7、Punycode、CESU-8、SCSU、UTF-32、GB18030 等。

接下来我们就来看一下 UTF-8 是如何解决 Unicode 的空间浪费问题。根据最新的规范,UTF-8 使用一至四个字节为每个字符编码,也就是说是可变长度的。其编码中的第一个字节仍与 ASCII 兼容,这使得原来处理 ASCII 字符的软件无须或只须做少部分修改,就可以继续使用。

我们以 汉字“码” 为例,根据上表(表格来自于维基百科)进行转换。首先“码”的 Unicode 编码为 U+7801,显然位于表中第三行的 U+0800 和 U+FFFF 之间。U+7801 对应的 16 进制编码为 7801,将其转换为二进制 111 1000 0000 0001。然后,我们把得到的二进制编码从右到左依次替换到 1110xxxx 10xxxxxx 10xxxxxx 里的 x 位置上,不够的位置用 0 来补足。最终我们得到一串二进制数据 1110 0111 1010 0000 1000 0001,这串数据就是汉字“码”对应的 UTF-8 编码。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/9032629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-24
下一篇 2023-04-24

发表评论

登录后才能评论

评论列表(0条)

保存