Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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 有没有一种简单的方法可以将字节附加到StringBuffer并指定编码? 问题:_Java_Utf 8_Character Encoding_Char_Byte - Fatal编程技术网

Java 有没有一种简单的方法可以将字节附加到StringBuffer并指定编码? 问题:

Java 有没有一种简单的方法可以将字节附加到StringBuffer并指定编码? 问题:,java,utf-8,character-encoding,char,byte,Java,Utf 8,Character Encoding,Char,Byte,将字节附加到StringBuffer(即将字节转换为字符)并指定所用字符编码(ASCII、UTF-8等)的最简单方法是什么 上下文 我想向stringbuffer追加一个字节。这样做需要将字节强制转换为字符: myStringBuffer.append((char)nextByte); 但是,上面的代码使用我的机器(MacRoman)的默认字符编码。同时,系统/网络中的其他组件需要UTF-8。所以我需要这样做: try { myStringBuffer.append(new Strin

将字节附加到StringBuffer(即将字节转换为字符)并指定所用字符编码(ASCII、UTF-8等)的最简单方法是什么

上下文 我想向stringbuffer追加一个字节。这样做需要将字节强制转换为字符:

myStringBuffer.append((char)nextByte);
但是,上面的代码使用我的机器(MacRoman)的默认字符编码。同时,系统/网络中的其他组件需要UTF-8。所以我需要这样做:

try {
    myStringBuffer.append(new String(new Byte[]{nextByte}, "UTF-8"));
} catch (UnsupportedEncodingException e) {
    //handle error
}
坦白说,这是相当丑陋的


当然,有更好的方法(除了将同一代码分成多行之外)??

简单的答案是“不”。如果该字节是多字节序列的第一个字节,该怎么办?没有什么能维持这个国家

如果您手头有一个逻辑字符的所有字节,则可以执行以下操作:

sb.append(new String(bytes, charset));
但是,如果您有一个UTF-8字节,那么对于股票类,您根本无法做到这一点

构建一个使用java.nio.charset类实现字节追加的精力充沛的StringBuffer并不十分困难,但它不会是一行或两行代码

注释表明这里需要一些基本的Unicode知识


在UTF-8中,“a”是一个字节,“á”是两个字节丧' 是三个字节,'我认为这里的错误在于处理字节。您希望改为处理字符串

只需在输入和输出流上插入一个读取器,即可为您完成字节和字符之间的映射。不过,对于输入,请使用构造函数的
InputStreamReader(InputStream in,CharsetDecoder dec)
形式,以便通过异常检测输入编码错误。现在有了字符串而不是字节缓冲区。在另一端放置一个
OutputStreamWriter


现在,您不再需要担心字节或编码。这样就简单多了。

我不确定我是否理解了您所说的关于“多字节”序列的问题。我有一系列UTF-8字符作为字节输入,我不断地将它们附加到字符串缓冲区(一个接一个)。我需要将字节转换成UTF-8字符,但这样做很难看。可能是因为这些字符实际上是我转换成UTF-8的ASCII字符。我对UTF-8知之甚少,它跨越多个字节吗?是的。ASCII字符由单字节表示,非ASCII字符由2、3或4字节表示。如果它们只是ASCII字符,则应使用仅捕获异常的帮助器方法<代码>公共静态字符串bytesToUsAscii(字节[]字节){try{return new String(字节,“US-ASCII”);}catch(UnsupportedEncodingException e){throw new IllegalStateException(e);}}。JVM保证US-ASCII是一种受支持的字符编码(以及UTF-8和UTF-16),因此除非出现严重错误,否则不会发生异常。@pick然后读他的第二句话,看看你是否像我一样摇摆不定。稍微偏离主题,在Java 5+中,使用
StringBuilder
代替
StringBuffer
s。除非您知道为什么需要
StringBuffer
(内部同步),否则与
StringBuilder
相比,您不需要它,后者在操作和方法上是相同的,但总是更快。