小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

判斷字符串是那種中文編碼 以及 字符的定位

 9loong 2009-03-03
 
判斷字符串是那種中文編碼 以及 字符的定位
2008-12-24 19:31

一、如果判斷一個(gè)字符是西文字符還是中文字符

    大家知道西文字符主要是指ASCII碼,它用一個(gè)字節(jié)表示。且這個(gè)字符轉(zhuǎn)換成數(shù)字之后,該數(shù)字是大于0的,而漢字是兩個(gè)字節(jié)的,第一個(gè)字節(jié)的轉(zhuǎn)化為數(shù)字之后應(yīng)該是小于0的,因此可以根據(jù)每個(gè)字節(jié)轉(zhuǎn)化為數(shù)字之后是否小于0,判斷它是否是漢字。

    例如,設(shè)輸入字為strin,則,

     If (strin.at(0) < 0)
       cout << ”是漢字” << endl;
     else cout << ”不是漢字” << endl;



二、C++ 中判斷字符中文編碼

直接根據(jù)漢字的編碼范圍判斷,對(duì)于GB2312和GBK可用下面兩個(gè)程序?qū)崿F(xiàn)。

1、判斷是否是GB2312

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<=247 && ch2>=160 && ch2<=254)
            return true;
        else return false;
    }
    else return false;
}

2、判斷是否是GBK編碼

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<=254 && ch2>=64 && ch2<=254)
            return true;
        else return false;
    }
    else return false;
}

3、判斷是否為Big5

它的范圍為:高字節(jié)從0xA0到0xFE,低字節(jié)從0x40到0x7E,和0xA1到0xFE兩部分。判斷一個(gè)漢字是否是BIG5編碼,可以如上對(duì)字符的編碼范圍判斷即可。

三、java中判斷字符編碼以及轉(zhuǎn)碼
[參考]判斷字符編碼以及轉(zhuǎn)碼的一個(gè)工具類
http://hi.baidu.com/pazhu/blog/item/efcce7a2034ae9a8caefd05b.html
2008-07-01 08:55

/**
* Date: 2008-6-27
* <p>Copyright: Copyright (c) 2006</p>
* <p>Company:浙江鴻程 </p>
*
* @version 1.0
* @author: SRH
*/
public class TranCharset {

    private static final String PRE_FIX_UTF = "&#x";
    private static final String POS_FIX_UTF = ";";

    public TranCharset() {
    }

    /**
     * Translate   charset   encoding   to   unicode
     *
     * @param sTemp charset   encoding   is   gb2312
     * @return charset   encoding   is   unicode
     */
    public static String XmlFormalize(String sTemp) {
        StringBuffer sb = new StringBuffer();

        if (sTemp == null || sTemp.equals("")) {
            return "";
        }
        String s = TranCharset.TranEncodeTOGB(sTemp);
        for (int i = 0; i < s.length(); i++) {
            char cChar = s.charAt(i);
            if (TranCharset.isGB2312(cChar)) {
                sb.append(PRE_FIX_UTF);
                sb.append(Integer.toHexString(cChar));
                sb.append(POS_FIX_UTF);
            } else {
                switch ((int) cChar) {
                    case 32:
                        sb.append(" ");
                        break;
                    case 34:
                        sb.append(""");
                        break;
                    case 38:
                        sb.append("&");
                        break;
                    case 60:
                        sb.append("<");
                        break;
                    case 62:
                        sb.append(">");
                        break;
                    default:
                        sb.append(cChar);
                }
            }
        }
        return sb.toString();
    }

    /**
     * 將字符串編碼格式轉(zhuǎn)成GB2312
     *
     * @param str
     * @return
     */
    public static String TranEncodeTOGB(String str) {
        try {
            String strEncode = TranCharset.getEncoding(str);
            String temp = new String(str.getBytes(strEncode), "GB2312");
            return temp;
        } catch (java.io.IOException ex) {

            return null;
        }
    }

    /**
     * 判斷輸入字符是否為gb2312的編碼格式
     *
     * @param c 輸入字符
     * @return 如果是gb2312返回真,否則返回假
     */
    public static boolean isGB2312(char c) {
        Character ch = new Character(c);
        String sCh = ch.toString();
        try {
            byte[]   bb = sCh.getBytes("gb2312");
            if (bb.length > 1) {
                return true;
            }
        } catch (java.io.UnsupportedEncodingException ex) {
            return false;
        }
        return false;
    }

    /**
     * 判斷字符串的編碼
     *
     * @param str
     * @return
     */
    public static String getEncoding(String str) {
        String encode = "GB2312";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s = encode;
                return s;
            }
        } catch (Exception exception) {
        }
        encode = "ISO-8859-1";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s1 = encode;
                return s1;
            }
        } catch (Exception exception1) {
        }
        encode = "UTF-8";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s2 = encode;
                return s2;
            }
        } catch (Exception exception2) {
        }
        encode = "GBK";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s3 = encode;
                return s3;
            }
        } catch (Exception exception3) {
        }
        return "";
    }
}

四、字符定位

1. big5
   如何定位呢?那么也想象所有編碼排列為一個(gè)二維坐標(biāo),縱坐標(biāo)是高字節(jié),橫坐標(biāo)是低字節(jié)。這樣一行上的漢字個(gè)數(shù):(0x7E-0x40+ 1)+(0xFE-0xA1+1)=157。那么定位算法分兩塊,為:

    if 0x40<=ch2<=0x7E: #is big5 char
        index=((ch1-0xA1)*157+(ch2-0x40))*2
    elif 0xA1<=ch2<=0xFE: #is big5 char
        index=((ch1-0xA1)*157+(ch2-0xA1+63))*2

對(duì)于第二塊,計(jì)算偏移量時(shí)因?yàn)橛袃蓧K數(shù)值,所以在計(jì)算后面一段值時(shí),不要忘了前面還有一段值。0x7E-0x40+1=63。

2.其他應(yīng)該類似.
可以如下:對(duì)漢字進(jìn)行hash

    為了處理漢字的方便,在查找漢字的時(shí)候,我們通常會(huì)用到hash的方法,那怎么來確定一個(gè)漢字位置呢?這就和每種編碼的排列有關(guān)了,這里主要給出一種hash函數(shù)的策略。

(1) GB2312編碼
    對(duì)于GB2312編碼,設(shè)輸入的漢字為GBword (std::string),我們可以采用公式(C1-176)*94 + (C2-161)確定GBindex。其中,C1表示第一字節(jié),C2表示第二字節(jié)。具體如下:

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

    之所以用unsigned char類型,是因?yàn)閏har是一個(gè)字節(jié),如果用unsigend int,因?yàn)閕nt是4個(gè)字節(jié)的,所以會(huì)造成擴(kuò)展,導(dǎo)致錯(cuò)誤。
(2) GBK編碼
       對(duì)于GBK編碼,設(shè)輸入的漢字為GBKword,則可以采用公式   index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128),其中ch1是第一字節(jié),ch2是第二字節(jié)。

    具體的,

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


[參考] 字符集編碼詳解
http://www./humanchao/archive/2007/09/27/32989.html

[參考]判斷字符編碼以及轉(zhuǎn)碼的一個(gè)工具類
http://hi.baidu.com/pazhu/blog/item/efcce7a2034ae9a8caefd05b.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多