如何进行Python编码转换?

这样一行上的汉字个数应该为0xFE-0x40+1-1=190加1是因为要把0x40也算进去。减1是因为要把7F去掉)。定位时,我们先用高字节减去0x81,得到纵坐标偏移量。用低字节减去0x40得到横坐标偏移量。用纵坐标偏移量乘以每个汉字个数,加上横坐标偏移量就得到汉字的偏移量。再乘以2得到字节的偏移量。那么定位算法为:

2、Big5又称大五码,主要为香港与台湾使用,即是一个繁体字编码。每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE(即129-255),共126种。第二个字节的范围不连续,分别为0X40-0X7E(即64-126),0XA1-0XFE(即161-254),共157种。

以前使用的为GB-2312编程,它只有常用字,字数有限。后国家制定了新的GBK编码,汉字已经达到了2万多。GBK完全兼容原GB-2312编码,也就是说一个GB2312的编码在GBK上是一模一样的。这里所介绍的转换是以GBK为基础的,因此适用性很广。

bool isGBCode(const string& strIn)
{
    unsigned char ch1;
    unsigned char ch2;

    if (strIn.size() >= 2)
    {
        ch1 = (unsigned char)strIn.at(0);
        ch2 = (unsigned char)strIn.at(1);
        if (ch1>=176 && ch1=160 && ch2
            return true;
        else return false;
    }
    else return false;
}

那么如何定位一个GBK码呢?当我们拿到一个编码时,如何判断是不是一个GBK码,如果是GBK码如何定位它的位置呢?判断一个GBK码应该比较简单,我们只要根据它的有效范围进行判定即可。

三、怎样判断一个汉字的是什么编码
直接根据汉字的编码范围判断,对于GB2312和GBK可用下面两个程序实现。
1、判断是否是GB2312

http://www.bkjia.com/Pythonjc/594610.htmlwww.bkjia.comtruehttp://www.bkjia.com/Pythonjc/594610.htmlTechArticle下面文章主要将使用 Python编码转换
的程序向大家进行说明,如果对代码有什么不了解,建议大家还是去网上或者相关论坛去寻找,大多数…

GBKindex = ((unsigned char)GBKword[0]-129)*190 + ((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;

上面,我们已经可以得到GBK汉字和BIG5的字节位置。那么就可以开始进行转换了。对于转换我原以为有一个特别的算法,能够按照两种编码的不同,简单地通过计算就可以得出结果来,其实是不存在这种算法的。

If (strin.at(0) 
    cout 是汉字” 
else cout 不是汉字” 

判断一个汉字是否是BIG5编码,可以如上对字符的编码范围判断即可。如何定位呢?Python编码转换那么也想象所有编码排列为一个二维坐标,纵坐标是高字节,横坐标是低字节。这样一行上的汉字个数:(0x7E-0x40+1)+(0xFE-0xA1+1)=157。那么定位算法分两块。

GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned
char)GBword.at(1) – 161;

但真正细致的工作是在建立转换码表上。我们需要从GBK转BIG5的码表文件,和BIG5转GBK的码表文件。好在这一工作已经有人完成了,在网上可以找到这种信息。本人就是在网上找到了这种对应的转换码表,于是完成了一个用Python编码转换程序。

对于GB2312编码,设输入的汉字为GBword,我们可以采用公式(C1-176)*94 +
(C2-161)确定GBindex。其中,C1表示第一字节,C2表示第二字节。具体如下:

这里ch1和ch2分别是一个字符的高字节和低字节。如何定位为什么要定位我们在后面讲)?首先介绍一下码表。码表是所有编码放在一起形成的,你可以将其放在文件中这里讲述的是将编码放在文件中)。

  

GBK编码中不仅包括了原GB-2312编码,同时也包括了许多简码的繁体码,同时还有许多的符号与不常用汉字。GBK编码的范围是:高字节从0x81到0xFE,低字节从0x40到0xFE,同时不包括0x7F。这样如果我们将其排成一个矩形,看上去就少了xx7F一根线。

1、GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范,当然也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个汉字。

真正的做法是通过建立转换码表文件实现的。即对于GBK码表,将原位置上的GBK汉字改成相应的BIG5汉字。对于BIG5码表,将原位置上的BIG5汉字改成相应的GBK汉字。这样,由于原来汉字的位置没有变。

之所以用unsigned char类型,是因为char是一个字节,如果用unsigend
int,因为int是4个字节的,所以会造成扩展,导致错误。

ch2/128=1,则表示多算了7F一值,因此要去掉。由于一个汉字有两个字节,故要乘以2。这样我们就得到一个GBK汉字在码表中的字节位置了。BIG5是香港和台湾地区使用的编码集。它的范围为:高字节从0xA0到0xFE,低字节从0x40到0x7E,和0xA1到0xFE两部分。

if 0x40
    index = ((ch1-0xA1)*157+(ch2-0x40))*2 

elif 0xA1
    index = ((ch1-0xA1)*157+(ch2-0xA1+63))*2 

index=((ch1-0x81)*190+(ch2-0x40)-(ch2/128))*2上面的算法中有-(ch2/128)。这是因为GBK中没有7F码,因此当ch2小于7F时,ch2/128=0,则表示7F没有计算在内。而当ch2大于7F时。

  

我们在存放编码时是将有实际意义的编码放在了一起因为有一些组合是不存在的),而且是按字节大小的顺序放的。根据GBK的编码范围,我们可以设想一个二维坐标,纵坐标是高字节,横坐标是低字节,每一个交叉点上是一个汉字,占两个字节。

  

但编码已经变成了想要转换的编码。通过计算出原汉字的位置,将转换码表中对应汉字位置的字符取出来,这样就完成了转换这就是为什么要进行编码定位的原因)。的确,程序是简单的。

 

下面文章主要将使用Python编码转换的程序向大家进行说明,如果对代码有什么不了解,建议大家还是去网上或者相关论坛去寻找,大多数Python编码是大陆使用的编码集。

为了处理汉字的方便,在查找汉字的时候,我们通常会用到hash的方法,那怎么来确定一个汉字位置呢?这就和每种编码的排列有关了,这里主要给出一种hash函数的策略。

  • 浅析Python的GIL和线程安全
  • 开始IronPython之旅:交互式解释器与常用
  • Google Go!融合Python速度与C性能的新语
  • Google开始嫌Python不够快 平台级性能成
  • 深入探讨Ruby与Python语法比较

3、GBK是GB2312的扩展,是向上兼容的,因此GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含繁体字的编码,它与Big5编码之间的关系我还没有弄明白,好像是不一致的。GBK中每个汉字仍然包含两个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。

一、汉字编码的种类

二、对汉字进行hash

它的范围为:高字节从0xA0到0xFE,低字节从0x40到0x7E,和0xA1到0xFE两部分。判断一个汉字是否是BIG5编码,可以如上对字符的编码范围判断即可。如何定位呢?那么也想象所有编码排列为一个二维坐标,纵坐标是高字节,横坐标是低字节。这样一行上的汉字个数:(0x7E-0x40+1)+(0xFE-0xA1+1)=157。那么定位算法分两块,为:

汉字编码中现在主要用到的有三类,包括GBK,GB2312和Big5。

大家知道西文字符主要是指ASCII码,它用一个字节表示。且这个字符转换成数字之后,该数字是大于0的,而汉字是两个字节的,第一个字节的转化为数字之后应该是小于0的,因此可以根据每个字节转化为数字之后是否小于0,判断它是否是汉字。

对于第二块,计算偏移量时因为有两块数值,所以在计算后面一段值时,不要忘了前面还有一段值。0x7E-0x40+1=63。

 

表1 汉字编码范围
名称
第一字节
第二字节
GB2312
0xB0-0xF7(176-247)
0xA0-0xFE(160-254)
GBK
0x81-0xFE(129-254)
0x40-0xFE(64-254)
Big5
0x81-0xFE(129-255)
0x40-0x7E(64-126)
0xA1-0xFE(161-254)

2、判断是否是GBK编码

3、对于Big5

GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。

转自:http://blog.csdn.net/lizhi200404520/article/details/7074719

GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。

 

例如,设输入字为strin,则,

四、如果判断一个字符是西文字符还是中文字符

 

对于GBK编码,设输入的汉字为GBKword,则可以采用公式
index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128),其中ch1是第一字节,ch2是第二字节。

具体的,

bool isGBKCode(const string& strIn)
{
    unsigned char ch1;
    unsigned char ch2;

    if (strIn.size() >= 2)
    {
        ch1 = (unsigned char)strIn.at(0);
        ch2 = (unsigned char)strIn.at(1);
        if (ch1>=129 && ch1=64 && ch2
            return true;
        else return false;
    }
    else return false;
}