将Unicode转换为ASCII而不更改字符串长度(在Java中)

Zar*_*doz 9 java string unicode ascii

将字符串从Unicode转换为ASCII而不改变其长度的最佳方法是什么(在我的情况下这非常重要)?此外,没有任何转换问题的字符必须与原始字符串中的位置相同.因此,"Ä"必须转换为"A"而不是具有更多字符的神秘内容.

编辑:
@novalis - 这些符号(例如亚洲语言)应该只转换为一些占位符.我对这些词或他们的意思不太感兴趣.

@MtnViewMark - 在任何情况下我都必须保留所有字符的数量和ASCII可用字符的位置.

这里有一些更多信息:我有一些只能处理ASCII字符串的文本挖掘工具.大多数应该处理的文本是英文的,但有些文本包含非ASCII字符.我对这些单词不感兴趣,但我必须确保我感兴趣的单词(那些只包含ASCII字符的单词)在字符串转换后处于相同的位置.

Den*_*kiy 14

回答所述,以下代码应该有效:

    String s = "??? hello Ä";

    String s1 = Normalizer.normalize(s, Normalizer.Form.NFKD);
    String regex = "[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+";

    String s2 = new String(s1.replaceAll(regex, "").getBytes("ascii"), "ascii");

    System.out.println(s2);
    System.out.println(s.length() == s2.length());
Run Code Online (Sandbox Code Playgroud)

输出是

??? hello A
true
Run Code Online (Sandbox Code Playgroud)

所以你首先删除diactrical标记,转换为ascii.非ascii字符将成为问号.

  • 如果有人想删除问号,充分减少文字基本字母尝试:"[\\ p {} InBasicLatin] +"(注意大写P表示"不在)使用测试:rrrr̈r'ŕřttẗţỳỹẙy'yýÿŷpp̈sss̈s̊s's̸śŝŞşšddd̈ďd'ḑf̈f̸ggg̈g'ģqĝǧḧĥj̈j'ḱkk̈k̸ǩlll̈Łłẅẍcc̈c̊c'c̸Çççćĉčvv̈v'v̸bb̧ǹnn̈n̊n'ńņňñmmmm̈m̊m̌ǵß (2认同)

Ign*_*ams 8

使用java.text.Normalizer.normalize()Normalizer.Form.NFD,然后过滤掉非ASCII字符.