java - 用 ASCII 替换 Unicode

标签 java string encoding character-encoding

我在 Windows 系统上创建了一个文本文件,我认为默认编码样式是 ANSI,文件内容如下所示:

This is\u2019 a sample text file \u2014and it can ....

我使用 Windows 的默认编码风格保存了这个文件,尽管也有像 UTF-8、UTF-16 等编码风格可用。

现在我想编写一个简单的 java 函数,我将在其中传递一些输入字符串并将所有 unicode 替换为相应的 ascii 值。

例如:- \u2019 应替换为“'” \u2014 应替换为“-”等。

观察: 当我创建这样的字符串文字时

  String s = "This is\u2019 a sample text file \u2014and it can ....";

我的代码工作正常,但是当我从文件中读取它时它不工作。我知道在 Java 中 String 使用 UTF-16 编码。

下面是我用来读取输入文件的代码。

FileReader fileReader  = new FileReader(new File("C:\\input.txt"));
BufferedReader bufferedReader = new BufferedReader(fileReader)
String record = bufferedReader.readLine();

我也尝试过使用 InputStream 并将 Charset 设置为 UTF-8,但结果仍然相同。

替换代码:

public static String removeUTFCharacters(String data){      
        for(Entry<String,String> entry : utfChars.entrySet()){
            data=data.replaceAll(entry.getKey(), entry.getValue());
        }
        return data;
    }

map :

    utfChars.put("\u2019","'");
    utfChars.put("\u2018","'");
    utfChars.put("\u201c","\"");
    utfChars.put("\u201d","\"");
    utfChars.put("\u2013","-");
    utfChars.put("\u2014","-");
    utfChars.put("\u2212","-");
    utfChars.put("\u2022","*");

任何人都可以帮助我理解这个问题的概念和解决方案。

最佳答案

将转义序列\uXXXX 与正则表达式匹配。然后使用替换循环将每次出现的转义序列替换为字符的解码值。

因为 Java 字符串文字使用 \ 来引入转义,序列 \\ 用于表示 \。此外,Java 正则表达式语法对序列 \u 进行特殊处理(以表示 Unicode 转义)。因此 \ 必须再次转义,并添加一个 \\。所以,在模式中,"\\\\u" 的真正意思是,“匹配输入中的 \u。”

要匹配数字部分,四个十六进制字符,使用模式 \p{XDigit},用额外的 \ 转义 \ .我们希望将十六进制数作为一个组轻松提取,因此将其括在括号中以创建一个捕获组。因此,模式中的 "(\\p{XDigit}{4})" 表示,“匹配输入中的 4 个十六进制字符,并捕获它们。”

在一个循环中,我们搜索模式的出现,用解码的字符值替换每个出现。通过解析十六进制数来解码字符值。 Integer.parseInt(m.group(1), 16) 表示“将上一场比赛中捕获的组解析为 16 进制数。”然后用该字符创建替换字符串。替换字符串必须转义或引用,以防它是 $,这在替换文本中具有特殊含义。

String data = "This is\\u2019 a sample text file \\u2014and it can ...";
Pattern p = Pattern.compile("\\\\u(\\p{XDigit}{4})");
Matcher m = p.matcher(data);
StringBuffer buf = new StringBuffer(data.length());
while (m.find()) {
  String ch = String.valueOf((char) Integer.parseInt(m.group(1), 16));
  m.appendReplacement(buf, Matcher.quoteReplacement(ch));
}
m.appendTail(buf);
System.out.println(buf);

关于java - 用 ASCII 替换 Unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24215063/

相关文章:

java - 后记。获取文档页面大小

Java泛型方法——第一次使用

java - 您的 SQL 语法有误;查看与您的 MySQL 服务器对应的手册

javascript - 获取当前现代 Javascript 中字符串的最后一个字符,允许使用代理对(两个代码单元)的星体字符,例如表情符号

Java 6 相当于 Integer.compare

java - 第三次出现时用 null 替换子字符串

C++:如何构建字符串/字符*

encoding - 使用Notepad++更改保存文件的默认编码

android - 从 Android 应用程序发送到 Nodejs 服务器的编码问题,解码后是否有空格?

java - apache Camel 邮件中的主题 header 显示日语字符为 "=?iso-2022-jp.. "