如何使用命令去除重音并保留汉字?

问题描述

我正在尝试使用命令删除重音字符 (CAFÉ -> CAFE),同时保留所有中文字符。目前,我正在使用 iconv 删除重音字符。原来所有的汉字都被编码为“?????”。我想不出如何将汉字同时保存在一个 ASCII 编码的文件中。
我该怎么做?

import java.util.Scanner; class Main { public static void main(String[] args) { // put your code here Scanner sc = new Scanner(System.in); // define lengths int n = sc.nextInt(); int m = sc.nextInt(); // add length to matrix int[][] matrix = new int[n][m]; // insert elements for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { matrix[i][j] = sc.nextInt(); } } // define max int max = Integer.MIN_VALUE,row=0,col=0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (matrix[i][j] > max) { max = matrix[i][j]; row=i; col=j; } } } System.out.print("max: "+max + " is at: "); System.out.print(col + " " + row); //indexes starting from zero } }

解决方法

无法在ASCII编码的文件中保留汉字;这种编码只对 NUL (0x00) 和 0x7F (DEL) 之间的代码点进行编码,这基本上意味着基本控制字符加上基本 英文字母和标点符号。 (查看 ASCII chart 以获取枚举。)

您似乎要问的是如何从欧洲字母表中删除重音符号,同时在编码为 UTF-8 的文件中保持任何中文字符完整无缺。我相信使用 iconv 没有直接的方法可以做到这一点,但是用一种具有良好 Unicode 支持的语言(例如 Perl)想出一个单行应该很容易。

bash$ python -c 'print("\u4effCaf\u00e9\u9f00")' >unizh.txt
bash$ cat unizh.txt
仿Café鼀
bash$ perl -CSD -MUnicode::Normalize -pe '$_ = NFKD($_); s/\p{M}//g' unizh.txt 
仿Cafe鼀

也许可以添加 -i 选项来就地修改文件;这个简单的演示只是将结果写出到标准输出。

这具有潜在的不良副作用,将每个字符标准化为其 NFKD form.

Remove accents from accented characters和汉字启发的代码,从What's the complete range for Chinese characters in Unicode?中收集来进行测试(范围边界上的不是特别好的测试用例,所以我只是猜测了一点)。

,

iconv 工具旨在转换字符的编码方式(即以字节形式保存到文件中)。通过转换为 ASCII(一个非常有限的字符集,包含数字、一些标点符号以及大小写的基本字母表),您可以只保存可以合理匹配到该集的字符。所以像 É 这样的重音字母被转换为 E 因为它是一个相当相似的 ASCII 字符,但是像 公这样的中文字符与 ASCII 字符集相距甚远,只有一个问题标记是可能的。

answer by tripleee 可能正是您所需要的。但是,如果转换为 NFKD 形式对您来说是个问题,另一种方法是使用要替换的字符的直接列表:

sed 'y/áàäÁÀÄéèëÉÈË/aaaAAAeeeEEE/' <test.bin >converted.bin

您需要以相同顺序列出原始字符及其替换字符的位置。显然这需要更多的工作,因此只有在您需要完全控制所做的更改时才这样做。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...