转载:http://blog.chinaunix.net/u2/70445/showart_1133335.html一、判断一个字符是西文字符还是中文字符
大家知道西文字符主要是指ASCII码,它用一个字节表示。且这个字符转换成数字之后,该数字是大于0的,而汉字是两个字节的,第一个字节的转化为数字之后应该是小于0的,因此可以根据每个字节转化为数字之后是否小于0,判断它是否是汉字。
例如,设输入字为strin,则,
If (strin.at(0) < 0) cout << ”是汉字” << endl; else cout << ”不是汉字” << endl;二、C++中判断字符中文编码直接根据汉字的编码范围判断,对于GB2312和GBK可用下面两个程序实现。
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两部分。判断一个汉字是否是BIG5编码,可以如上对字符的编码范围判断即可。
三、Java中判断字符编码以及转码[参考]判断字符编码以及转码的一个工具类
http://hi.baidu.com/pazhu/blog/item/efcce7a2034ae9a8caefd05b.html
2008-07-01 08:55
/*** Date: 2008-6-27* Copyright: Copyright (c) 2006
* Company:浙江鸿程
** @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
如何定位呢?那么也想象所有编码排列为一个二维坐标,纵坐标是高字节,横坐标是低字节。这样一行上的汉字个数:(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
对于第二块,计算偏移量时因为有两块数值,所以在计算后面一段值时,不要忘了前面还有一段值。0x7E-0x40+1=63。
2.其他应该类似.
可以如下:
对汉字进行hash 为了处理汉字的方便,在查找汉字的时候,我们通常会用到hash的方法,那怎么来确定一个汉字位置呢?这就和每种编码的排列有关了,这里主要给出一种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类型,是因为char是一个字节,如果用unsigend int,因为int是4个字节的,所以会造成扩展,导致错误。
(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
[参考]判断字符编码以及转码的一个工具类
http://hi.baidu.com/pazhu/blog/item/efcce7a2034ae9a8caefd05b.html
阅读(4603) | 评论(0) | 转发(0) |