当前位置: 技术问答>java相关
byte、char数组转换为String的问题
来源: 互联网 发布时间:2015-01-12
本文导语: 文本数据没问题,二进制数据就会出错,所以再把String转回来数组,写入文件时,内容发生了变化,所以处理不到一些图片信息。我试过在byte、char数组转换为String时用了“8859_1”等编码参数,都无法正确转换。有什...
文本数据没问题,二进制数据就会出错,所以再把String转回来数组,写入文件时,内容发生了变化,所以处理不到一些图片信息。我试过在byte、char数组转换为String时用了“8859_1”等编码参数,都无法正确转换。有什么办法在byte、char数组转换为String时让数据不自动转换某些字符呢?
|
to zjxyz:
看到jre里的i18n.jar中的类, 又看了看String的源代码, 我有个想法, 希望你不会笑话我:p
String(你可以看做是一个char[])中char[]到byte[]的转化都遵循一定的编码规则, 而这些规则在jre中的i18n.jar里. 我的想法就是添加一个规则进去, 呵呵 ...
比如String的getBytes方法, 实质是将String(也就是char[])转成byte[], 以此为例. 下面是我觉得比较能说明问题的代码:p
sun.io.Converters
--
...
private static Class getConverterClass(int type, String encoding)
throws UnsupportedEncodingException
{
String enc = null;
/* "ISO8859_1" is the canonical name for the ISO-Latin-1 encoding.
Native code in the JDK commonly uses the alias "8859_1" instead of
"ISO8859_1". We hardwire this alias here in order to avoid loading
the full alias table just for this case. */
if (!encoding.equals("ISO8859_1")) {
if (encoding.equals("8859_1")) {
enc = "ISO8859_1";
} else {
enc = CharacterEncoding.aliasName(encoding);
}
}
if (enc == null) {
enc = encoding;
}
try {
return Class.forName(getConverterPackageName()
+ "." + converterPrefix[type] + enc);
} catch(ClassNotFoundException e) {
throw new UnsupportedEncodingException(enc);
}
}
...
也不用太仔细看上面的代码了, 知道是动态加载类就好了, 而这证明了上面我说的进行扩充的可行性 :)
再说详细点, 你可以定义一种编码规则, 比如"X7788", 借助它来实现你所说的"在byte、char数组转换为String时让数据不自动转换某些字符", 你需要做的是提供两个类: sun.io.ByteToCharX7788 和 sun.io.CharToByteX7788 ...
抱歉本来应该先试试在说的, 但实在觉得困了, 所以 ... 就当是瞎侃吧:p
Good luck :)
看到jre里的i18n.jar中的类, 又看了看String的源代码, 我有个想法, 希望你不会笑话我:p
String(你可以看做是一个char[])中char[]到byte[]的转化都遵循一定的编码规则, 而这些规则在jre中的i18n.jar里. 我的想法就是添加一个规则进去, 呵呵 ...
比如String的getBytes方法, 实质是将String(也就是char[])转成byte[], 以此为例. 下面是我觉得比较能说明问题的代码:p
sun.io.Converters
--
...
private static Class getConverterClass(int type, String encoding)
throws UnsupportedEncodingException
{
String enc = null;
/* "ISO8859_1" is the canonical name for the ISO-Latin-1 encoding.
Native code in the JDK commonly uses the alias "8859_1" instead of
"ISO8859_1". We hardwire this alias here in order to avoid loading
the full alias table just for this case. */
if (!encoding.equals("ISO8859_1")) {
if (encoding.equals("8859_1")) {
enc = "ISO8859_1";
} else {
enc = CharacterEncoding.aliasName(encoding);
}
}
if (enc == null) {
enc = encoding;
}
try {
return Class.forName(getConverterPackageName()
+ "." + converterPrefix[type] + enc);
} catch(ClassNotFoundException e) {
throw new UnsupportedEncodingException(enc);
}
}
...
也不用太仔细看上面的代码了, 知道是动态加载类就好了, 而这证明了上面我说的进行扩充的可行性 :)
再说详细点, 你可以定义一种编码规则, 比如"X7788", 借助它来实现你所说的"在byte、char数组转换为String时让数据不自动转换某些字符", 你需要做的是提供两个类: sun.io.ByteToCharX7788 和 sun.io.CharToByteX7788 ...
抱歉本来应该先试试在说的, 但实在觉得困了, 所以 ... 就当是瞎侃吧:p
Good luck :)