Java提取并替换文本中非ASCII字符的实现问题求助
解决非ASCII字符替换问题
首先你得修正HashMap的键值映射——你现在是把ASCII字符作为键,非ASCII字符作为值,这搞反了。要实现替换,应该把带重音的非ASCII字符作为键,对应的ASCII字符作为值,这样才能用非ASCII字符去查找要替换成的目标。
然后,针对筛选出的含非ASCII字符的行,我们可以遍历每个字符,判断它是否在映射表中,存在就替换,否则保留原字符。另外,FileReader默认使用系统编码读取文件,可能导致非ASCII字符读取乱码,建议改用InputStreamReader指定UTF-8编码,避免编码问题。
修改后的完整代码如下:
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { // 修正映射关系:键是要替换的非ASCII字符,值是目标ASCII字符 Map<Character, Character> charMap = new HashMap<>(); charMap.put('ó', 'o'); charMap.put('é', 'e'); charMap.put('ï', 'i'); try (BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream("movie-names.txt"), "UTF-8"))) { String contentLine; while ((contentLine = br.readLine()) != null) { String[] contents = contentLine.split("\\|"); if (contents.length < 2) { // 处理格式异常的行,避免数组越界 continue; } String movieName = contents[1]; boolean isAsciiOnly = movieName.matches("\\A\\p{ASCII}*\\z"); if (!isAsciiOnly) { // 构建替换后的字符串 StringBuilder sb = new StringBuilder(); for (char c : movieName.toCharArray()) { // 若字符在映射表中,替换为对应ASCII字符,否则保留原字符 sb.append(charMap.getOrDefault(c, c)); } // 输出原行和替换后的结果 System.out.println("原行:" + contentLine); System.out.println("替换后:" + contents[0] + "|" + sb.toString()); System.out.println("---"); } } } catch (IOException ioe) { System.err.println("无法打开文件:" + ioe.getMessage()); } } }
关键改动说明:
- 修正HashMap映射:把
'o'->'ó'改成'ó'->'o',这样才能正确匹配要替换的非ASCII字符。 - 字符遍历替换:用
StringBuilder高效构建替换后的字符串,遍历每个字符时,用getOrDefault方法简化判断——存在就取映射值,不存在就保留原字符。 - 编码优化:使用
InputStreamReader指定UTF-8编码读取文件,避免因系统编码不同导致的非ASCII字符乱码。 - 异常防护:增加了数组长度判断,防止分割后数组越界的问题。
内容的提问来源于stack exchange,提问作者JackofSpades
相关产品推荐
相关产品推荐

