Algorithm: 字符串转换为 unicode 字节数组
2012-11-26 15:25
429 查看
本文转自:http://blog.csdn.net/androidbluetooth/article/details/7686760
只要牵扯到字符编码的编程,脾气就会异常的
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/angry.gif)
,看着那一堆堆乱码,就巴不得拿刀砍死它!
现在有个这样的需求:
使用打印机打印指定的内容,然后按照指定的协议与设备通信。
该打印机认识 unicode 编码的字符。
所以,需要将指定内容(String)转换为 unicode 编码,然后转换为对应的 unicode 字节数组。
编码实现:
[java] view
plaincopyprint?
/**
* 将字符串转换为 unicode 字符.
*
* @param src
* 要转换的字符串.
* @return byte[] 字符串的字节数组.
* @throws NullPointerException
* 输入的字符串为空时,抛出该异常.
* @throws IllegalArgumentException
* 转义字符如 \t,在做为参数是应该是 \\t,否则程序报异常.
*/
public static byte[] string2Unicode(String src)
throws NullPointerException, IllegalArgumentException {
if (src == null) {
throw new NullPointerException("the parameter of src is Null");
}
// 定义常量: 空格
final String SPACE = " ";
// 定义常量: 16 进制
final int RADIX_HEX = 16;
if ("".equals(src)) {
src = src + SPACE;
}
// 字符串长度
final int len = src.length();
// 字符串转换为字符数组
char[] utfChar = src.toCharArray();
System.out.println("utfChar length = " + utfChar.length);
String hexStr = "";
// 返回值(unicode字符编码是两个字节)
byte[] result = new byte[len * 2];
for (int i = 0; i < len; i++) {
// 转换为16进制
hexStr = Integer.toHexString(utfChar[i]);
// System.out.println("hexStr = " + hexStr);
// 英文字符需要在前面补加数字 00
if (hexStr.length() > 1 && hexStr.length() <= 2) {
hexStr = "00" + hexStr;
} else { // 如果转义字符写错(如\t应该是\\t),报此异常
// continue;
throw new IllegalArgumentException(
"the parameter of src is error, and you'd better check escaped character.");
}
// 截取字符串
String head = hexStr.substring(0, 2);
String tail = hexStr.substring(2, 4);
try {
// 16进制数转换为byte
result[i * 2] = (byte) Integer.parseInt(head, RADIX_HEX);
result[i * 2 + 1] = (byte) Integer.parseInt(tail, RADIX_HEX);
} catch (NumberFormatException nfe) {
continue;
}
}
return result;
}
测试用例:
[java] view
plaincopyprint?
public static void main(String[] args) {
String src = "UNICODE\\t\\n\\rG OD";
System.out.println(src);
byte[] xx;
try {
xx = DataUtil.string2Unicode(src);
int size = xx.length;
for(int i=0;i<size; i++) {
System.out.println("xx[" + i + "]= " + xx[i]);
}
} catch (Exception e) {
e.printStackTrace();
}
}
在线转换工具测试结果(16 进制):
\u55 ----------------------- 'U'
\u4e ----------------------- 'N'
\u49 ----------------------- 'I'
\u43 ----------------------- 'C'
\u4f ----------------------- 'O'
\u44 ----------------------- 'D'
\u45 ----------------------- 'E'
\u5c\u74 ----------------------- '\t'
\u5c\u6e ----------------------- '\n'
\u5c\u72 ----------------------- '\r'
\u47 ----------------------- 'G'
\u20 ----------------------- ' '(空格)
\u4f ----------------------- 'O'
\u44 ----------------------- 'D'
测试案例测试结果:
xx[0]= 0 xx[1]= 85 ----------------------- 'U'
xx[2]= 0 xx[3]= 78 ----------------------- 'N'
xx[4]= 0 xx[5]= 73 ----------------------- 'I'
xx[6]= 0 xx[7]= 67 ----------------------- 'C'
xx[8]= 0 xx[9]= 79 ----------------------- 'O'
xx[10]= 0 xx[11]= 68 ----------------------- 'D'
xx[12]= 0 xx[13]= 69 ----------------------- 'E'
xx[14]= 0 xx[15]= 92 ----------------------- '\t'
xx[16]= 0 xx[17]= 116
xx[18]= 0 xx[19]= 92 ----------------------- '\n'
xx[20]= 0 xx[21]= 110
xx[22]= 0 xx[23]= 92 ----------------------- '\r'
xx[24]= 0 xx[25]= 114
xx[26]= 0 xx[27]= 71 ----------------------- 'G'
xx[28]= 0 xx[29]= 32 ----------------------- ' '
xx[30]= 0 xx[31]= 79 ----------------------- 'O'
xx[32]= 0 xx[33]= 68 ----------------------- 'D'
实现代码缺陷(目前发现的):
需要转义的字符一定要使用这种形式:\\t
测试结果一致,打烊!
只要牵扯到字符编码的编程,脾气就会异常的
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/angry.gif)
,看着那一堆堆乱码,就巴不得拿刀砍死它!
现在有个这样的需求:
使用打印机打印指定的内容,然后按照指定的协议与设备通信。
该打印机认识 unicode 编码的字符。
所以,需要将指定内容(String)转换为 unicode 编码,然后转换为对应的 unicode 字节数组。
编码实现:
[java] view
plaincopyprint?
/**
* 将字符串转换为 unicode 字符.
*
* @param src
* 要转换的字符串.
* @return byte[] 字符串的字节数组.
* @throws NullPointerException
* 输入的字符串为空时,抛出该异常.
* @throws IllegalArgumentException
* 转义字符如 \t,在做为参数是应该是 \\t,否则程序报异常.
*/
public static byte[] string2Unicode(String src)
throws NullPointerException, IllegalArgumentException {
if (src == null) {
throw new NullPointerException("the parameter of src is Null");
}
// 定义常量: 空格
final String SPACE = " ";
// 定义常量: 16 进制
final int RADIX_HEX = 16;
if ("".equals(src)) {
src = src + SPACE;
}
// 字符串长度
final int len = src.length();
// 字符串转换为字符数组
char[] utfChar = src.toCharArray();
System.out.println("utfChar length = " + utfChar.length);
String hexStr = "";
// 返回值(unicode字符编码是两个字节)
byte[] result = new byte[len * 2];
for (int i = 0; i < len; i++) {
// 转换为16进制
hexStr = Integer.toHexString(utfChar[i]);
// System.out.println("hexStr = " + hexStr);
// 英文字符需要在前面补加数字 00
if (hexStr.length() > 1 && hexStr.length() <= 2) {
hexStr = "00" + hexStr;
} else { // 如果转义字符写错(如\t应该是\\t),报此异常
// continue;
throw new IllegalArgumentException(
"the parameter of src is error, and you'd better check escaped character.");
}
// 截取字符串
String head = hexStr.substring(0, 2);
String tail = hexStr.substring(2, 4);
try {
// 16进制数转换为byte
result[i * 2] = (byte) Integer.parseInt(head, RADIX_HEX);
result[i * 2 + 1] = (byte) Integer.parseInt(tail, RADIX_HEX);
} catch (NumberFormatException nfe) {
continue;
}
}
return result;
}
测试用例:
[java] view
plaincopyprint?
public static void main(String[] args) {
String src = "UNICODE\\t\\n\\rG OD";
System.out.println(src);
byte[] xx;
try {
xx = DataUtil.string2Unicode(src);
int size = xx.length;
for(int i=0;i<size; i++) {
System.out.println("xx[" + i + "]= " + xx[i]);
}
} catch (Exception e) {
e.printStackTrace();
}
}
在线转换工具测试结果(16 进制):
\u55 ----------------------- 'U'
\u4e ----------------------- 'N'
\u49 ----------------------- 'I'
\u43 ----------------------- 'C'
\u4f ----------------------- 'O'
\u44 ----------------------- 'D'
\u45 ----------------------- 'E'
\u5c\u74 ----------------------- '\t'
\u5c\u6e ----------------------- '\n'
\u5c\u72 ----------------------- '\r'
\u47 ----------------------- 'G'
\u20 ----------------------- ' '(空格)
\u4f ----------------------- 'O'
\u44 ----------------------- 'D'
测试案例测试结果:
xx[0]= 0 xx[1]= 85 ----------------------- 'U'
xx[2]= 0 xx[3]= 78 ----------------------- 'N'
xx[4]= 0 xx[5]= 73 ----------------------- 'I'
xx[6]= 0 xx[7]= 67 ----------------------- 'C'
xx[8]= 0 xx[9]= 79 ----------------------- 'O'
xx[10]= 0 xx[11]= 68 ----------------------- 'D'
xx[12]= 0 xx[13]= 69 ----------------------- 'E'
xx[14]= 0 xx[15]= 92 ----------------------- '\t'
xx[16]= 0 xx[17]= 116
xx[18]= 0 xx[19]= 92 ----------------------- '\n'
xx[20]= 0 xx[21]= 110
xx[22]= 0 xx[23]= 92 ----------------------- '\r'
xx[24]= 0 xx[25]= 114
xx[26]= 0 xx[27]= 71 ----------------------- 'G'
xx[28]= 0 xx[29]= 32 ----------------------- ' '
xx[30]= 0 xx[31]= 79 ----------------------- 'O'
xx[32]= 0 xx[33]= 68 ----------------------- 'D'
实现代码缺陷(目前发现的):
需要转义的字符一定要使用这种形式:\\t
测试结果一致,打烊!
相关文章推荐
- Algorithm: 字符串转换为 unicode 字节数组
- Java整数-字节,字节-字符,字节数组-十六进制字符串转换
- 如何将字节数组转换为十六进制的字符串
- 用VB.NET将字节数组转换为字符串
- 16进制与字符串、字节数组之间的转换
- C#字节数组转换成字符串
- 将字节数组转换为十六进制值字符串时 Byte 的用法
- C# 16进制与字符串、字节数组之间的转换
- JavaScript十六进制字符串和字节数组相互转换
- 字节数组与字符串(字符数组)的转换操作
- C# 16进制与字符串、字节数组之间的转换
- 字节数组、数值和十六进制字符串的转换
- C# 16进制与字符串、字节数组之间的转换
- C# 16进制与字符串、字节数组之间的转换
- C# 16进制与字符串、字节数组之间的转换
- .net和JAVA字符串转换为字节数组
- jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换
- .NET编程 -- 字节数组、数值和十六进制字符串的转换
- C# 16进制与字符串、字节数组之间的转换(转)
- 主题:Java整数-字节,字节-字符,字节数组-十六进制字符串转换