|
一、如果判斷一個(gè)字符是西文字符還是中文字符 大家知道西文字符主要是指ASCII碼,它用一個(gè)字節表示。且這個(gè)字符轉換成數字之后,該數字是大于0的,而漢字是兩個(gè)字節的,第一個(gè)字節的轉化為數字之后應該是小于0的,因此可以根據每個(gè)字節轉化為數字之后是否小于0,判斷它是否是漢字。 例如,設輸入字為strin,則, If (strin.at(0) < 0) cout << ”是漢字” << endl; else cout << ”不是漢字” << endl; 二、C++ 中判斷字符中文編碼 直接根據漢字的編碼范圍判斷,對于GB2312和GBK可用下面兩個(gè)程序實(shí)現。 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 它的范圍為:高字節從0xA0到0xFE,低字節從0x40到0x7E,和0xA1到0xFE兩部分。判斷一個(gè)漢字是否是BIG5編碼,可以如上對字符的編碼范圍判斷即可。 三、java中判斷字符編碼以及轉碼 [參考]判斷字符編碼以及轉碼的一個(gè)工具類(lèi) 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 = ""; 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(); } /** * 將字符串編碼格式轉成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è)二維坐標,縱坐標是高字節,橫坐標是低字節。這樣一行上的漢字個(gè)數:(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 對于第二塊,計算偏移量時(shí)因為有兩塊數值,所以在計算后面一段值時(shí),不要忘了前面還有一段值。0x7E-0x40+1=63。 2.其他應該類(lèi)似. 可以如下:對漢字進(jìn)行hash 為了處理漢字的方便,在查找漢字的時(shí)候,我們通常會(huì )用到hash的方法,那怎么來(lái)確定一個(gè)漢字位置呢?這就和每種編碼的排列有關(guān)了,這里主要給出一種hash函數的策略。 (1) GB2312編碼 對于GB2312編碼,設輸入的漢字為GBword (std::string),我們可以采用公式(C1-176)*94 + (C2-161)確定GBindex。其中,C1表示第一字節,C2表示第二字節。具體如下: GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161; 之所以用unsigned char類(lèi)型,是因為char是一個(gè)字節,如果用unsigend int,因為int是4個(gè)字節的,所以會(huì )造成擴展,導致錯誤。 (2) GBK編碼 對于GBK編碼,設輸入的漢字為GBKword,則可以采用公式 index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128),其中ch1是第一字節,ch2是第二字節。 具體的, GBKindex = ((unsigned char)GBKword[0]-129)*190 + ((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128; [參考] 字符集編碼詳解 http://www.cppblog.com/humanchao/archive/2007/09/27/32989.html [參考]判斷字符編碼以及轉碼的一個(gè)工具類(lèi) http://hi.baidu.com/pazhu/blog/item/efcce7a2034ae9a8caefd05b.html |
聯(lián)系客服