Java';getBytes(“ISO-8859-1”)返回字符串中每个2字节字符的第一个字节?

Java';getBytes(“ISO-8859-1”)返回字符串中每个2字节字符的第一个字节?,java,android,unicode,Java,Android,Unicode,我认为UCS-2到ISO-8859-1与 rawData = new byte[data.length()]; for(int i=0; i<data.length(); i++) { rawData[i] = (byte)(data.charAt(i) & 0xff); } rawData=新字节[data.length()]; 对于(int i=0;iPer thw Android: 无法在命名字符集中表示此字符串时的行为未指定 在实践

我认为UCS-2到ISO-8859-1与

    rawData = new byte[data.length()];
    for(int i=0; i<data.length(); i++) {
        rawData[i] = (byte)(data.charAt(i) & 0xff);
    }
rawData=新字节[data.length()];
对于(int i=0;iPer thw Android:

无法在命名字符集中表示此字符串时的行为未指定

在实践中,此调用最终成为一个变量,它采用显式的
字符集
,这将用一些替换序列替换不可翻译的字符。在Sun JDK中,这是一个单字节值64(“?”)

但是,在您对前面答案的评论中,您保证字符串中没有大于“0xFF”的字符值,那么您就做错了。ISO-8859-1是UCS-2/UTF-16的适当子集。

每thw Android:

无法在命名字符集中表示此字符串时的行为未指定

在实践中,此调用最终成为一个变量,它采用显式的
字符集
,这将用一些替换序列替换不可翻译的字符。在Sun JDK中,这是一个单字节值64(“?”)


但是,在您对前面答案的评论中,您保证字符串中没有大于“0xFF”的字符值,那么您就做错了。ISO-8859-1是UCS-2/UTF-16的适当子集。

原因已经由parsifal的答案解释过。为了完整起见,这里的代码相当于
data.getBytes(“ISO-8859-1”)
(假设字符串是纯UCS-2字符串,没有代理项对):


parsifal的回答已经解释了原因。为了完整起见,这里的代码相当于
data.getBytes(“ISO-8859-1”)
(假设字符串是纯UCS-2字符串,没有代理项对):


不,如果字符串在由
UTF-16
ISO-8859-1
编码时产生相同的字节,这将是一个“适当的子集”,但显然不是。我可能做错了什么。我将通过比较两种不同方法的两个字节[]进行双重检查。不,这将是一个“适当的子集”如果字符串在通过
UTF-16
ISO-8859-1
编码时产生相同的字节,这显然不是。我可能做错了什么。我将通过比较两种不同方法的两个字节[]进行双重检查。
byte[] rawdata = new byte[data.length()];
for(int i = 0; i < data.length; i++) {
    char c = data.charAt(i);
    if (c > 255) {
        rawData[i] = (byte)'?';
    }
    else {
        rawData[i] = (byte)c;
    }
}
byte[] rawData = new byte[data.length()];
int j = 0;
for(int i = 0; i < data.length; i++, j++) {
    int c = data.codePointAt(i);
    if(c < 0x100) {
        rawData[j] = (byte)c;
    }
    else {
        rawData[j] = (byte)'?';
        if(c >= 0x10000) {
           // surrogate pair
           i++;
        }
    }
}
if(j < rawData.length) {
   rawData = Arrays.copyOf(rawData, j);
}
byte[] rawData = new byte[data.length()];
int j = 0;
for(int i = 0; i < data.length; i++, j++) {
    char c = data.charAt(i);
    if(c < 0x100) {
        rawData[j] = (byte)c;
    }
    else {
        rawData[j] = (byte)'?';
        if(Character.isHighSurrogate(c) && Character.isLowSurrogate(data.charAt(i+1))) {
           // surrogate pair
           i++;
        }
    }
}
if(j < rawData.length) {
   rawData = Arrays.copyOf(rawData, j);
}