Java UTF-8字符串和二进制数据存在问题
史前: 我可以用我需要的二进制数据提取子字符串,但是当我使用Java UTF-8字符串和二进制数据存在问题,java,string,file-io,Java,String,File Io,史前: 我可以用我需要的二进制数据提取子字符串,但是当我使用 String s = matcher.group(1); 数据似乎被破坏了,确切地说,被破坏的只是那些属于扩展ASCII表的字符,可能从128到255。其他字符保持不变,但有些已损坏。 我的基本意思是,我需要将这个“s”字符串转换为字节数组,但这: 字符串s2=新字符串(s.getBytes(),“US-ASCII”) 还是这个 String s2 = new String(s.getBytes(), "ISO-8859-1
String s = matcher.group(1);
数据似乎被破坏了,确切地说,被破坏的只是那些属于扩展ASCII表的字符,可能从128到255。其他字符保持不变,但有些已损坏。 我的基本意思是,我需要将这个“s”字符串转换为字节数组,但这: 字符串s2=新字符串(s.getBytes(),“US-ASCII”) 还是这个
String s2 = new String(s.getBytes(), "ISO-8859-1")
后来呢,
fileOutputStream.write(s2.getBytes())
将扩展ASCII表中的所有字符替换为“?”,而\0或“A”等其他字符则保持不变
如何将字符串解释为普通的[0-255]ascii二进制符号
PS
我解决了,一个人应该用
String encoding = "ISO-8859-1";
要对字节数组进行编码/解码,一切都能完美工作。Java只知道一般的Unicode字符串。只要您关心字母的基本字节值,您就是在处理字节,应该使用字节数组。您只能将Java字符串转换为特定编码的字节数组(它可能是一个隐式默认参数,但始终存在)。您不能使用
字符串
数据类型并期望保留您的特定编码,您必须在每次从外部Java读取数据或将数据导出到其他地方(例如文本字段输入或文件系统)时指定它
使用字节数组意味着不能直接使用Java对正则表达式的内置支持。这是一种痛苦,但正如你所看到的,它无论如何都不会给出正确的结果,这不是一个意外——它不能正确地为你想做的事情工作。您确实必须使用其他方法来操作字节流,因为
String
s编码是不可知的,而且永远都是。Java只知道一般的Unicode字符串。只要您关心字母的基本字节值,您就是在处理字节,应该使用字节数组。您只能将Java字符串转换为特定编码的字节数组(它可能是一个隐式默认参数,但始终存在)。您不能使用字符串
数据类型并期望保留您的特定编码,您必须在每次从外部Java读取数据或将数据导出到其他地方(例如文本字段输入或文件系统)时指定它
使用字节数组意味着不能直接使用Java对正则表达式的内置支持。这是一种痛苦,但正如你所看到的,它无论如何都不会给出正确的结果,这不是一个意外——它不能正确地为你想做的事情工作。您确实必须使用其他东西来操作字节流,因为String
s编码不可知,而且永远都是
我的基本意思是,我需要将这个“s”字符串转换成字节数组
直接回答这个问题:
byte[] array = Charset.forName("utf-8").encode(CharBuffer.wrap(s)).array();
编辑:String添加了一个helper函数,该函数使用更少的代码执行与上面相同的操作:
byte[] array = s.getBytes(Charset.forName("utf-8"));
我的基本意思是,我需要将这个“s”字符串转换成字节数组
直接回答这个问题:
byte[] array = Charset.forName("utf-8").encode(CharBuffer.wrap(s)).array();
编辑:String添加了一个helper函数,该函数使用更少的代码执行与上面相同的操作:
byte[] array = s.getBytes(Charset.forName("utf-8"));
您也可以使用比Gunslinger47显示的代码少一点的代码来完成此操作
byte[] utf8Bytes = s.getBytes("UTF8");
您也可以使用比Gunslinger47显示的代码少一点的代码来完成此操作
byte[] utf8Bytes = s.getBytes("UTF8");