Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UTF-8字符串和二进制数据存在问题_Java_String_File Io - Fatal编程技术网

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");