求gb18030与Unicode编码转换的方法

时间:2020-12-09 17:31:20
在php中,似乎可以通过函数iconv转换,不知有没有谁对此有过研究,iconv的支持那些字符集之间的转换?或者是如何添加字符集使其支持相应的字符编码?
   如果不通过iconv函数,而是希望通过建立字符映射表的方式进行转换的话,我想问一下如何建立 Unicode 和 GB18030之间的映射表?
   百思不得其解。顿首

5 个解决方案

#1


iconv的支持那些字符集之间的转换?
支持主流的字符集之间的转换

如何添加字符集使其支持相应的字符编码?
不知道,这需要重新编译iconv函数

如果不通过iconv函数,而是希望通过建立字符映射表的方式进行转换的话,我想问一下如何建立 Unicode 和 GB18030之间的映射表?
我国的汉字编码标准自1980年公布的gb2312以后,历经gbk到正式的gb18030。当然还要继续扩展
我国的汉字编码标准在世界编码标准集中编号为Code Page 936简称CP936
在网上搜索cp936就可以找到编码标准的文本和图谱,其中包含对应的unicode编码
于是,构造映射表可从编码标准中提取需要的信息
另外,在支持iconv的环境中只需一个双重循环就可以产生映射表了。何乐而不为呢?

#2


"在支持iconv的环境中只需一个双重循环就可以产生映射表"?
我已经用此函数生成了GBK TO Unicode的码表(依据gbk的编码范围例如双字节高位为0x80~0xFE);
反过来这个循环就不知道该怎么写了,因为不知道Unicode的标准中有那些编码字符是收录于gb18030是中的?

#3


参考
  function gen_unicode_gbk() {
         $fp = fopen(DICT_PATH.'unicode_gbk.txt', 'rb+');
for($i=0x80; $i<0xfe; $i++) {
for($j=0x40; $j<0xfe; $j++) {
$ch = chr($i).chr($j);
$un = iconv('gbk', 'ucs-2', $ch);
$x = hexdec(bin2hex($un));
if($x>40869 || $x<19968) {
$ar[$un] = $ch;
}else {
$offs = ($x-19968)*2;
fseek($fp, $offs);
fwrite($fp, $ch);
}
}
}
$offs = (40870-19968)*2;
fseek($fp, $offs);
ksort($ar);
foreach($ar as $k=>$v) {
fwrite($fp, $k.$v);
}
fclose($fp);
  }

#4


在Unicode标准中,0x4e00(19968)-0x9fa6(40870)为CKJ Unified Ideographs.我已经用该函数成功的生成相应的对照表。3KS XZ.
    我还有些不明白的地方:
    1.0x4e00(19968)-0x9fa6(40870)包含了全部的GBK或是GB18030汉字吗?
    2.关于中文标点的问题,用紫光的拼音打出来的逗号(",") 其编码为0xa3ac。(紫光选择的是GBK字符集)0xa3ac似乎并不在0x4e00-0x9fa6当中,那应该怎么样处理才更全面?或者说有没有GBK或是GB18030的官方网页发布相关的信息?(我发现一个网页是www.gb18030.org,但上面似乎没什么有用的信息,页面我认为最重要的链接,竟然无效)。

#5


1、对照表与查询方式有关。注意我的函数生成的对照表是分段的,分别使用计算偏移和顺序查找两种方式。目的是为了减少对照表文件的尺寸
2、0x4e00(19968)-0x9fa6(40870)包含了全部的GBK或是GB18030汉字吗?
不是!你从我的函数中就可看出。
小于0x4e00和大于0x9fa6的部分因为不连续,被单独处理了
3、"," 的gb2312编码为0xa3ac,unicode编码为0xff0c

#1


iconv的支持那些字符集之间的转换?
支持主流的字符集之间的转换

如何添加字符集使其支持相应的字符编码?
不知道,这需要重新编译iconv函数

如果不通过iconv函数,而是希望通过建立字符映射表的方式进行转换的话,我想问一下如何建立 Unicode 和 GB18030之间的映射表?
我国的汉字编码标准自1980年公布的gb2312以后,历经gbk到正式的gb18030。当然还要继续扩展
我国的汉字编码标准在世界编码标准集中编号为Code Page 936简称CP936
在网上搜索cp936就可以找到编码标准的文本和图谱,其中包含对应的unicode编码
于是,构造映射表可从编码标准中提取需要的信息
另外,在支持iconv的环境中只需一个双重循环就可以产生映射表了。何乐而不为呢?

#2


"在支持iconv的环境中只需一个双重循环就可以产生映射表"?
我已经用此函数生成了GBK TO Unicode的码表(依据gbk的编码范围例如双字节高位为0x80~0xFE);
反过来这个循环就不知道该怎么写了,因为不知道Unicode的标准中有那些编码字符是收录于gb18030是中的?

#3


参考
  function gen_unicode_gbk() {
         $fp = fopen(DICT_PATH.'unicode_gbk.txt', 'rb+');
for($i=0x80; $i<0xfe; $i++) {
for($j=0x40; $j<0xfe; $j++) {
$ch = chr($i).chr($j);
$un = iconv('gbk', 'ucs-2', $ch);
$x = hexdec(bin2hex($un));
if($x>40869 || $x<19968) {
$ar[$un] = $ch;
}else {
$offs = ($x-19968)*2;
fseek($fp, $offs);
fwrite($fp, $ch);
}
}
}
$offs = (40870-19968)*2;
fseek($fp, $offs);
ksort($ar);
foreach($ar as $k=>$v) {
fwrite($fp, $k.$v);
}
fclose($fp);
  }

#4


在Unicode标准中,0x4e00(19968)-0x9fa6(40870)为CKJ Unified Ideographs.我已经用该函数成功的生成相应的对照表。3KS XZ.
    我还有些不明白的地方:
    1.0x4e00(19968)-0x9fa6(40870)包含了全部的GBK或是GB18030汉字吗?
    2.关于中文标点的问题,用紫光的拼音打出来的逗号(",") 其编码为0xa3ac。(紫光选择的是GBK字符集)0xa3ac似乎并不在0x4e00-0x9fa6当中,那应该怎么样处理才更全面?或者说有没有GBK或是GB18030的官方网页发布相关的信息?(我发现一个网页是www.gb18030.org,但上面似乎没什么有用的信息,页面我认为最重要的链接,竟然无效)。

#5


1、对照表与查询方式有关。注意我的函数生成的对照表是分段的,分别使用计算偏移和顺序查找两种方式。目的是为了减少对照表文件的尺寸
2、0x4e00(19968)-0x9fa6(40870)包含了全部的GBK或是GB18030汉字吗?
不是!你从我的函数中就可看出。
小于0x4e00和大于0x9fa6的部分因为不连续,被单独处理了
3、"," 的gb2312编码为0xa3ac,unicode编码为0xff0c