Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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 6将utf8转换为iso88591字符集并忽略不可映射字符_Java_Utf 8_Character Encoding - Fatal编程技术网

Java 6将utf8转换为iso88591字符集并忽略不可映射字符

Java 6将utf8转换为iso88591字符集并忽略不可映射字符,java,utf-8,character-encoding,Java,Utf 8,Character Encoding,我编写了以下函数,该函数可以去除iso88591中无法表示的字符串中的字符: public static String convert(String str) { if (str.length()==0) return str; str = str.replace("–","-"); str = str.replace("“","\""); str = str.replace("”","\""); return new String(str.getByte

我编写了以下函数,该函数可以去除iso88591中无法表示的字符串中的字符:

public static String convert(String str) {
    if (str.length()==0) return str;
    str = str.replace("–","-");
    str = str.replace("“","\"");
    str = str.replace("”","\"");
    return new String(str.getBytes(),iso88591charset);
}
我的问题是这没有我需要的行为。 当遇到没有表示形式的字符时,它将转换为多个字节。我想把那个字符从结果中简单地省略掉

我还希望不必使用所有这些替换命令

我一直在研究charsetEnocder。它有如下方法:

CharsetEncoder encoder = iso88591charset.newEncoder();
encoder.onMalformedInput(CodingErrorAction.IGNORE);
encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
这似乎是我想要的,但我甚至没有编写一个函数来模仿我使用charset encoder已经拥有的功能,而仅仅是设置这些选项

此外,我仅限于Java 6:

更新: 我想出了一个糟糕的解决办法,但一定有更好的办法:

public static String convert(String str) {
    if (str.length()==0) return str;
    str = str.replace("–","-");
    str = str.replace("“","\"");
    str = str.replace("”","\"");
    String str2 = "";
    for (int c=0;c<str.length();c++) {
        String cur = (new Character(str.charAt(c))).toString();
        if (cur.equals(new String(cur.getBytes(),iso88591charset))) str2 += cur;
    }
    return new String(str2.getBytes(),iso88591charset);
}

一种可能的方法是

// U+2126 - omega sign
// U+2013 - en dash
// U+201c - left double quotation mark
// U+201d - right double quotation mark
String str = "\u2126\u2013\u201c\u201d";
System.out.println("original = " + str);
str = str.replace("–", "-");
str = str.replace("“", "\"");
str = str.replace("”", "\"");
System.out.println("replaced = " + str);
StringBuilder sb = new StringBuilder();
for (char c : str.toCharArray()) {
    if (c <= '\u00ff') {
        sb.append(c);
    }
}
System.out.println("stripped = " + sb);

要映射到ISO-8859-1,只需忽略数值>=256的所有字符。但是,这将不包括您所做的替换。要在ISO 8859-1编码中表示文本,您必须使用不是专门为UTF-16设计的数据类型,如字符串、字符和字符。字节[]怎么样?既然字符串、字符和字符都是用于UTF-16的,那么UTF-8又是如何出现的呢?也许这是关于文本来源的一个细节。一旦你有了一个字符串,它就不重要了。文本的来源是utf-8,它需要传递给一个不受我控制的旧函数,如果我传递任何不能在iso88591中表示的东西,它就会失效。好的,utf-16字符串到utf-16字符串,带音译和过滤。有几种编写过滤的方法,但都类似于@SubOptimal。Unicode是根据ISO 8859-1设计的:前256个代码点是相同的。所以,在UTF-16中,@Henry你是对的。我的错误。在答案中修正了它。
original = Ω–“”
replaced = Ω-""
stripped = -""