Java整型数组转换为StringBuilder

5
如何在 while 循环中将带有 UTF-8 字符串的 int 数组转换为 StringBuilder?
例如:
int 数组:71、73、70、56、57、97、149、0、55、0、247...
结果字符串:GIF89a• €÷€ € €€ÀÜÀ¦Êð*?ª*?ÿ...
该行包含拉丁文、西里尔文和亚洲文字、各种符号和数字。
do buffer.append((char)num[++i]);
while((byte)buffer.charAt(buffer.length()-1) != -1);

该方法分解所有非拉丁字符。


你能展示整个缓冲区的数据吗? - Sergey Kalinichenko
+1 得到“奇怪”的符号在问题中.. :) - Asif
2个回答

3

首先将int []转换为byte [],如下:

    //intArray contains your data...
    byte[] utf8bytes = new byte[intArray.length];
    for(int i = 0; i < intArray.length; i++)
    {
        utf8bytes[i] = (byte) intArray[i];
    }

然后,使用UTF-8编码从您的字节中创建一个字符串:

    String asString = new String(utf8bytes, "UTF-8");

int类型是否只包含1个字节而不是4个字节? - Dmitriy
从你(诚然很少的)示例值中看来,你处理的是一个小于256的int数组,因此可以轻松地转换为字节。如果你的int中有4个字节,则它们大多数情况下具有非常大的绝对值。如果确实是这种情况,你可以使用位掩码和逻辑移位将它们拆分成单独的字节。 - Malcolm Smith
utf8bytes[0] = (byte)(intArray[i] >>> 24); utf8bytes[1] = (byte)(intArray[i] >>> 16); utf8bytes[2] = (byte)(intArray[i] >>> 8); utf8bytes[3] = (byte)intArray[i]; 每个拉丁字符后添加3个空格字符。每个西里尔字符后添加2个空格字符。 - Dmitriy

0

您正在读取GIF89a文件,每个字节作为一个整数,并将其打印出来,就好像它是一个文本字符串一样。主要问题在于该文件中的整数(字节)实际上并不映射到有意义的文本字符,因此在映射无法呈现字母的部分时,它将呈现您的文本编码所规定的内容(对我来说看起来像是很多垃圾)。

图形信息并不总是能够清晰地映射到文本上。虽然有256个可能的字节值,有时一个或多个字节会表示一个单独的字符,但英文字母只有26个,包括大写和小写字母。加上十个数字和一些标点符号,你得到大约80个常用于文章中的不同字符。其余的160多个字符是控制代码、信号以使用多字节或映射到支持显示外语的字符。

那些垃圾是与您当前字符集的有效字节到字符映射最接近的东西。如果您想要更好的输出,则尝试读取包含映射到某些字符相关数据的文件。


1
不,这只是一个例子,该程序并非设计用于读取文件。该程序将处理俄语和亚洲语言的文本消息。 - Dmitriy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接