java 中判断字符是否为big5码_【转载】判断一个字符是西文字符还是中文字符

转载: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值