public class ChineseLetter {
// 国标码和区位码转换常量
private static final int GB_SP_DIFF = 160;
// 存放国标一级汉字不同读音的起始区位码
private static final int[] secPosValueList = { 1601, 1637, 1833, 2078,
2274, 2302, 2433, 2594, 2787, 3106, 3212, 3472, 3635, 3722, 3730,
3858, 4027, 4086, 4390, 4558, 4684, 4925, 5249, 5600 };
// 存放国标一级汉字不同读音的起始区位码对应读音
private static final char[] firstLetter = { 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'w', 'x', 'y', 'z' };
// 获取一个字符串的拼音码
public static String getFirstLetter(String oriStr) {
String str = oriStr.toLowerCase();
StringBuffer buffer = new StringBuffer();
char ch;
char[] temp;
for (int i = 0; i < str.length(); i++) { // 依次处理str中每个字符
ch = str.charAt(i);
temp = new char[] { ch };
byte[] uniCode = new String(temp).getBytes();
if (uniCode[0] < 128 && uniCode[0] > 0) { // 非汉字
buffer.append(temp);
} else {
buffer.append(convert(uniCode));
}
}
return buffer.toString();
}
// 获取一个汉字的首字母
public static char convert(byte[] bytes) {
char result = '-';
int secPosValue = 0;
int i;
for (i = 0; i < bytes.length; i++) {
bytes[i] -= GB_SP_DIFF;
}
secPosValue = bytes[0] * 100 + bytes[1];
for (i = 0; i < 23; i++) {
if (secPosValue >= secPosValueList[i]
&& secPosValue < secPosValueList[i + 1]) {
result = firstLetter[i];
break;
}
}
return result;
}
public static void main(String[] args) {
System.out.println(ChineseLetter.getFirstLetter("我是中国人"));
}
}
------------------------------------------------------------------------------------------------------------------
取汉字拼音首字母
package test;
public class WordToSpell {
// 国标码和区位码转换常量
private static final int GB_SP_DIFF = 160;
// 存放国标一级汉字不同读音的起始区位码
private static final int[] secPosvalueList = {
1601, 1637, 1833, 2078, 2274, 2302, 2433, 2594, 2787,
3106, 3212, 3472, 3635, 3722, 3730, 3858, 4027, 4086,
4390, 4558, 4684, 4925, 5249, 5600};
// 存放国标一级汉字不同读音的起始区位码对应读音
private static final char[] firstLetter = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'w', 'x', 'y', 'z'};
// 获取一个字符串的拼音码
public static String getFirstLetter(String oriStr) {
String str = oriStr.toLowerCase();
StringBuffer buffer = new StringBuffer();
char ch;
char[] temp;
for (int i = 0; i < str.length(); i++) { //依次处理str中每个字符
ch = str.charAt(i);
temp = new char[] {
ch};
byte[] uniCode = new String(temp).getBytes();
if (uniCode[0] < 128 && uniCode[0] > 0) { // 非汉字
buffer.append(temp);
}
else {
buffer.append(convert(uniCode));
}
}
return buffer.toString();
}
/** 获取一个汉字的拼音首字母。
* GB码两个字节分别减去160,转换成10进制码组合就可以得到区位码
* 例如汉字“你”的GB码是0xC4/0xE3,分别减去0xA0(160)就是0x24/0x43
* 0x24转成10进制就是36,0x43是67,那么它的区位码就是3667,在对照表中读音为‘n’
*/
private static char convert(byte[] bytes) {
char result = '-';
int secPosvalue = 0;
int i;
for (i = 0; i < bytes.length; i++) {
bytes[i] -= GB_SP_DIFF;
}
secPosvalue = bytes[0] * 100 + bytes[1];
for (i = 0; i < 23; i++) {
if (secPosvalue >= secPosvalueList[i] &&
secPosvalue < secPosvalueList[i + 1]) {
result = firstLetter[i];
break;
}
}
return result;
}
public static String getBarcode(String isbn) {
String barcode = "978";
int a = 0, b = 0;
int m = 0;
int c = 0; //偶数和为a,计数和为b
//获取中间9位数字
isbn = isbn.substring(isbn.indexOf("-") - 1, isbn.lastIndexOf("-"));
isbn = isbn.replaceAll("-", ""); //去掉第一个-
isbn = isbn.replaceAll("-", ""); //去掉第二个-
barcode += isbn;
for (int i = 0; i < barcode.length(); i++) {
if (i % 2 == 0) {
b += Integer.parseInt(barcode.substring(m, m + 1));
m++;
}
else {
a += Integer.parseInt(barcode.substring(m, m + 1));
m++;
}
}
a = a * 3; //偶数和乘3
c = a + b; //a+b
int last = 0;
String str = c + ""; //获取c的字符串
last = 10 - Integer.parseInt(str.substring(str.length() - 1, str.length()));
if (last == 10) {
last = 0;
}
barcode = barcode + last;
return barcode;
}
public static void main(String[] arg){
System.out.println(getFirstLetter("汉字"));
}
}
-----------------------------------------------------------------------------------------------------------
提取汉字拼音首字母(Java版) 收藏 此文于2010-03-02被推荐到CSDN首页
如何被推荐?
package info.gnuhpc;
/**
* @author gnuhpc email: warmbupt@gmail.com blog: http://gnuhpc.info
* @date 2010-1-22
* @bugs 不支持多音字处理
*/
public class PinyinConv {
// 简体中文的编码范围从B0A1(45217)一直到F7FE(63486)
private static int BEGIN = 45217;
private static int END = 63486;
// 按照声母表示,这个表是在GB2312中的出现的第一个汉字,也就是说“啊”是代表首字母a的第一个汉字。
// i, u, v都不做声母, 自定规则跟随前面的字母
private static char[] chartable = { '啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈',
'哈', '击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然', '撒', '塌', '塌',
'塌', '挖', '昔', '压', '匝', };
// 二十六个字母区间对应二十七个端点
// GB2312码汉字区间十进制表示
private static int[] table = new int[27];
// 对应首字母区间表
private static char[] initialtable = { 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
't', 't', 'w', 'x', 'y', 'z', };
// 初始化
static {
for (int i = 0; i < 26; i++) {
table[i] = gbValue(chartable[i]);// 得到GB2312码的首字母区间端点表,十进制。
}
table[26] = END;// 区间表结尾
}
// ------------------------public
区------------------------
/**
* 根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串 最重要的一个方法,思路如下:一个个字符读入、判断、输出
*/
public static String cn2py(String SourceStr) {
String Result = "";
int StrLength = SourceStr.length();
int i;
try {
for (i = 0; i < StrLength; i++) {
Result += Char2Initial(SourceStr.charAt(i));
}
} catch (Exception e) {
Result = "";
}
return Result;
}
// ------------------------private方法区------------------------
/**
* 输入字符,得到他的声母,英文字母返回对应的大写字母,其他非简体汉字返回 '0'
*
*/
private static char Char2Initial(char ch) {
// 对英文字母的处理:小写字母转换为大写,大写的直接返回
if (ch >= 'a' && ch <= 'z')
return (char) (ch - 'a' + 'A');
if (ch >= 'A' && ch <= 'Z')
return ch;
// 对非英文字母的处理:转化为首字母,然后判断是否在码表范围内,
// 若不是,则直接返回。
// 若是,则在码表内的进行判断。
int gb = gbValue(ch);// 汉字转换首字母
if ((gb < BEGIN) || (gb > END))// 在码表区间之前,直接返回
return ch;
int i;
for (i = 0; i < 26; i++) {// 判断匹配码表区间,匹配到就break,判断区间形如“[,)”
if ((gb >= table[i]) && (gb < table[i+1]))
break;
}
if (gb==END) {//补上GB2312区间最右端
i=25;
}
return initialtable[i]; // 在码表区间中,返回首字母
}
/**
* 取出汉字的编码 cn 汉字
*/
private static int gbValue(char ch) {// 将一个汉字(GB2312)转换为十进制表示。
String str = new String();
str += ch;
try {
byte[] bytes = str.getBytes("GB2312");
if (bytes.length < 2)
return 0;
return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
} catch (Exception e) {
return 0;
}
}
public static void main(String[] args) throws Exception {
System.out.println(cn2py("重庆重视发展IT行业,大多数外企,如,IBM等进驻山城"));
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gnuhpc/archive/2010/03/02/5338020.aspx
----------------------------------------------------------------------------------------------------------
下面的例子测试能进行ascii<--->中文之间互转
import sun.io.CharToByteConverter;
import sun.io.ByteToCharConverter;
/**不能显示中文的问题*/
@SuppressWarnings("deprecation")
public class UnicodeToAscii {
public UnicodeToAscii() {
super();
}
/**
* 将Ascii转换成中文字符串
*/
public static String AsciiToChineseString(char[] s) {
byte[] dest = new byte[s.length];
for (int i = 0; i < s.length; i++)
dest[i] = (byte) (s[i] & 0xFF);
try {
ByteToCharConverter toChar = ByteToCharConverter
.getConverter("gb2312");
return new String(toChar.convertAll(dest));
} catch (Exception e) {
System.out.println(e);
return "";
}
}
public static String AsciiToChineseString(String s) {
if (s == null)
return s;
char[] orig = s.toCharArray();
byte[] dest = new byte[orig.length];
for (int i = 0; i < orig.length; i++)
dest[i] = (byte) (orig[i] & 0xFF);
try {
ByteToCharConverter toChar = ByteToCharConverter
.getConverter("gb2312");
return new String(toChar.convertAll(dest));
} catch (Exception e) {
System.out.println(e);
return s;
}
}
/**
* 将中文字符串转换成Ascii
*/
public static String ChineseStringToAscii(String s) {
if (s == null)
return s;
try {
CharToByteConverter toByte = CharToByteConverter
.getConverter("gb2312");
byte[] orig = toByte.convertAll(s.toCharArray());
char[] dest = new char[orig.length];
for (int i = 0; i < orig.length; i++)
dest[i] = (char) (orig[i] & 0xFF);
return new String(dest);
} catch (Exception e) {
System.out.println(e);
return s;
}
}
/**
* 中文转ascii
*
* 要进行转换的字符串
* 是否进行转换,一个开关控制 , true代表需要转换。
* 转换后的字符串
*/
public static String ChineseStringToAscii(String s, boolean bl) {
if (!bl)
return s;
else
return ChineseStringToAscii(s);
}
/**
* ascii转字符串
*/
public static String AsciiToChineseString(char[] s, boolean bl) {
if (!bl)
return null;
else
return AsciiToChineseString(s);
}
public static String AsciiToChineseString(String s, boolean bl) {
if (!bl)
return s;
else
return AsciiToChineseString(s);
}
/**
* 根据输入的源串(中文或中西文混合)返回其拼音首字母,以小写返回,如果首字符非拼音字母,则统一返回*号
*
* @param str
* 源串(中文或中西文混合)
* @return 返回str的拼音首字母,以小写返回,如果首字符非拼音字母,则统一返回*号
*/
public static String getFirstCharOfString(String str) {
String firstChar = "*";
if (str == null || str.length() <= 0)
return firstChar;
try {
byte firstCharBytes[] = new byte[2];
int gbcode;
firstCharBytes[0] = str.getBytes("gb2312")[0];
gbcode = firstCharBytes[0] & 0x000000ff;
if (str.length() > 1 || gbcode >= 0xb0) {
firstCharBytes[1] = str.getBytes("gb2312")[1];
gbcode = (firstCharBytes[0] & 0x000000ff) * 0x100
+ (firstCharBytes[1] & 0x000000ff);
}
if (gbcode >= 0xb0a1 && gbcode <= 0xb0c4)
firstChar = "a";
else if (gbcode >= 0xb0c5 && gbcode <= 0xb2c0)
firstChar = "b";
else if (gbcode >= 0xb2c1 && gbcode <= 0xb4ed)
firstChar = "c";
else if (gbcode >= 0xb4ee && gbcode <= 0xb6e9)
firstChar = "d";
else if (gbcode >= 0xb6ea && gbcode <= 0xb7a1)
firstChar = "e";
else if (gbcode >= 0xb7a2 && gbcode <= 0xb8c0)
firstChar = "f";
else if (gbcode >= 0xb8c1 && gbcode <= 0xb9fd)
firstChar = "g";
else if (gbcode >= 0xb9fe && gbcode <= 0xbbf6)
firstChar = "h";
else if (gbcode >= 0xbbf7 && gbcode <= 0xbfa5)
firstChar = "j";
else if (gbcode >= 0xbfa6 && gbcode <= 0xc0ab)
firstChar = "k";
else if (gbcode >= 0xc0ac && gbcode <= 0xc2e7)
firstChar = "l";
else if (gbcode >= 0xc2e8 && gbcode <= 0xc4c2)
firstChar = "m";
else if (gbcode >= 0xc4c3 && gbcode <= 0xc5b5)
firstChar = "n";
else if (gbcode >= 0xc5b6 && gbcode <= 0xc5bd)
firstChar = "o";
else if (gbcode >= 0xc5be && gbcode <= 0xc6d9)
firstChar = "p";
else if (gbcode >= 0xc6da && gbcode <= 0xc8ba)
firstChar = "q";
else if (gbcode >= 0xc8bb && gbcode <= 0xc8f5)
firstChar = "r";
else if (gbcode >= 0xc8f6 && gbcode <= 0xcbf9)
firstChar = "s";
else if (gbcode >= 0xcbfa && gbcode <= 0xcdd9)
firstChar = "t";
else if (gbcode >= 0xcdda && gbcode <= 0xcef3)
firstChar = "w";
else if (gbcode >= 0xcef4 && gbcode <= 0xd1b8)
firstChar = "x";
else if (gbcode >= 0xd1b9 && gbcode <= 0xd4d0)
firstChar = "y";
else if (gbcode >= 0xd4d1 && gbcode <= 0xd7f9)
firstChar = "z";
else
gbcode = firstCharBytes[0];
if (gbcode >= 'A' && gbcode <= 'Z')
gbcode += 32;
if (gbcode >= 'a' && gbcode <= 'z')
firstChar = String.valueOf((char) gbcode);
} catch (Exception e) {
System.out.println("getFirstCharOfString Exception: "
+ e.getMessage());
}
return firstChar;
}
}