Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
String kotlin问题中ByteArray转换为UTF-8字符集的字符串_String_Kotlin_Utf 8_Byte - Fatal编程技术网

String kotlin问题中ByteArray转换为UTF-8字符集的字符串

String kotlin问题中ByteArray转换为UTF-8字符集的字符串,string,kotlin,utf-8,byte,String,Kotlin,Utf 8,Byte,我有点困惑 // default charset utf8 val bytes = byteArrayOf(78, 23, 41, 51, -32, 42) val str = String(bytes) // there i got array [78, 23, 41, 51, -17, -65, -67, 42] val weird = str.toByteArray() 出于某种原因,我将随机值放入bytes属性。为什么不一致?这里的问题是您的字节不是有效的序列 例如,任何字节序列都可以

我有点困惑

// default charset utf8
val bytes = byteArrayOf(78, 23, 41, 51, -32, 42)
val str = String(bytes)
// there i got array [78, 23, 41, 51, -17, -65, -67, 42]
val weird = str.toByteArray()

出于某种原因,我将随机值放入bytes属性。为什么不一致?

这里的问题是您的字节不是有效的序列

例如,任何字节序列都可以被解释为有效(值为0–31的字节可能存在问题,但这些字节通常不会停止存储和处理字符)。类似的情况也适用于大多数其他8位字符集

但UTF-8的情况并非如此。虽然1-127范围内的所有字节序列都是有效的UTF-8(并且与ASCII和大多数8位编码中的解释相同),但128-255范围内的字节只能以特定形式出现(这有几个非常有用的特性:它允许您以非常高的概率识别UTF-8;它还避免了同步、搜索、排序和c方面的问题。)

在这种情况下,问题中的序列(在无符号十六进制中为
4e172933e02a
)无效UTF-8

因此,当您尝试使用默认编码(UTF-8)将其转换为字符串时,JVM将替换-value U+FFFD,如下所示:
-替换每个无效字符

然后,当您将其转换回UTF-8时,您将得到重放字符的UTF-8编码,即
EF BF BD
。如果您将其解释为有符号字节,您将得到问题中的
-17-65-67


因此Kotlin/JVM正在尽其所能处理无效输入。

这里的问题是您的字节不是有效序列

例如,任何字节序列都可以被解释为有效(值为0–31的字节可能存在问题,但这些字节通常不会停止存储和处理字符)。类似的情况也适用于大多数其他8位字符集

但UTF-8的情况并非如此。虽然1-127范围内的所有字节序列都是有效的UTF-8(并且与ASCII和大多数8位编码中的解释相同),但128-255范围内的字节只能以特定形式出现(这有几个非常有用的特性:它允许您以非常高的概率识别UTF-8;它还避免了同步、搜索、排序和c方面的问题。)

在这种情况下,问题中的序列(在无符号十六进制中为
4e172933e02a
)无效UTF-8

因此,当您尝试使用默认编码(UTF-8)将其转换为字符串时,JVM将替换-value U+FFFD,如下所示:
-替换每个无效字符

然后,当您将其转换回UTF-8时,您将得到重放字符的UTF-8编码,即
EF BF BD
。如果您将其解释为有符号字节,您将得到问题中的
-17-65-67


因此Kotlin/JVM正在尽其所能处理无效输入。

[-17,-65,-67]
array(十六进制
0xEF,0xBF,0xBD
)是字节顺序标记(UTF-8)(在拉丁文1中显示为
ï½
)@JosefZ不,那是
0xEF,0xBB,0xBF
。我的错。事实上,
[-17,-65,-67]/code>字节数组(十六进制
0xEF,0xBF,0xBD
)在拉丁文1中显示为
U+FFFD
替换字符。谢谢@AlexeyRomanov:字节顺序标记不同:
U+FEFF
(hexa
0xEF,0xBB,0xBF
,latin1
ï?
)零宽度无中断空间。
[-17,-65,-67]
数组(十六进制
0xEF,0xBF,0xBD
)是字节顺序标记(UTF-8)(在拉丁文1中显示为
0xEF½
。@JosefZ不,那是
0xEF,0xBB,0xBF
。我的错。事实上,在拉丁文1中显示为
0xEF,0xBF,0xBF
[-17,-65,-67]
字节数组(十六进制
0xEF,0xBF,0xBD
)是错误的�
U+FFFD
替换字符。谢谢@AlexeyRomanov:字节顺序标记不同:
U+FEFF
(hexa
0xEF,0xBB,0xBF
,latin1
ï»
)零宽度无中断空间。