java - 转换符号,重音字母到英文字母表

  显示原文与译文双语对照的内容
0 0

问题是,就像你所知,Unicode图表中有成千上万的字符 ,我想将所有相似的字符转换成英文字母表中的字母。

例如下面是一些转换:


ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...

我看到有超过 20个版本的字母a/a 。 我不知道如何分类它们。 它们看起来像大海捞针。

unicode字符的完整列表位于 http://www.ssec.wisc.edu/~tomw/java/unicode.html 或者 http://unicode.org/charts/charindex.html 。 试着向下滚动看看字母的变化。

如何使用Java转换所有这些? 请帮助我:(

时间: 原作者:

0 0

新任命我的帖子从如何删除变音符号( 音符). NET 从一个字符串?

这里方法在 java ( 纯粹用于删除变音符号,即重音) 中工作良好。

它基本上将所有重音字符转换为它们的deAccented对应符号,然后是它们组合的音调符号。 现在你可以使用 正规表达式 来去除音调符号。


import java.text.Normalizer;
import java.util.regex.Pattern;

public String deAccent(String str) {
 String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD); 
 Pattern pattern = Pattern.compile("p{InCombiningDiacriticalMarks}+");
 return pattern.matcher(nfdNormalizedString).replaceAll("");
}

原作者:
0 0

你可以尝试使用 unidecode,它可以作为 ruby gem,也可以作为上的 perl模块。 基本上,它是一个巨大的查找表,其中每个unicode代码点都与一个ascii字符或者字符串相关。

原作者:
0 0

"正在转换"任意Unicode到ASCII的问题是字符的意义是 culture-dependent 。

另外,Unicode有多个相同字形的码位。

结果是这样做的唯一方法是创建一个包含每个Unicode字符和你想要转换的ASCII字符的大量表。 你可以通过将字符规范化为正常化形式KD来获取快捷方式,但不是所有字符都正常化为 ASCII 。 另外,Unicode不定义字形的哪些部分是"音符"。

下面是一个应用的简短摘录:


switch (c)
{
 case 'A':
 case 'u00C0': //À LATIN CAPITAL LETTER A WITH GRAVE
 case 'u00C1': //Á LATIN CAPITAL LETTER A WITH ACUTE
 case 'u00C2': //Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX
 //and so on for about 20 lines...
 return"A";
 break;

 case 'u00C6'://Æ LATIN CAPITAL LIGATURE AE
 return"AE";
 break;

 //And so on for pages...
}

原作者:
0 0

public class AsciiUtils {
 private static final String PLAIN_ASCII =
"AaEeIiOoUu"//grave
 +"AaEeIiOoUuYy"//acute
 +"AaEeIiOoUuYy"//circumflex
 +"AaOoNn"//tilde
 +"AaEeIiOoUuYy"//umlaut
 +"Aa"//ring
 +"Cc"//cedilla
 +"OoUu"//double acute
 ;

 private static final String UNICODE =
"u00C0u00E0u00C8u00E8u00CCu00ECu00D2u00F2u00D9u00F9" 
 +"u00C1u00E1u00C9u00E9u00CDu00EDu00D3u00F3u00DAu00FAu00DDu00FD" 
 +"u00C2u00E2u00CAu00EAu00CEu00EEu00D4u00F4u00DBu00FBu0176u0177" 
 +"u00C3u00E3u00D5u00F5u00D1u00F1"
 +"u00C4u00E4u00CBu00EBu00CFu00EFu00D6u00F6u00DCu00FCu0178u00FF" 
 +"u00C5u00E5" 
 +"u00C7u00E7" 
 +"u0150u0151u0170u0171" 
 ;

//private constructor, can't be instanciated!
 private AsciiUtils() { }

//remove accentued from a string and replace with ascii equivalent
 public static String convertNonAscii(String s) {
 if (s == null) return null;
 StringBuilder sb = new StringBuilder();
 int n = s.length();
 for (int i = 0; i <n; i++) {
 char c = s.charAt(i);
 int pos = UNICODE.indexOf(c);
 if (pos> -1){
 sb.append(PLAIN_ASCII.charAt(pos));
 }
 else {
 sb.append(c);
 }
 }
 return sb.toString();
 }

 public static void main(String args[]) {
 String s = 
"The result : È,É,Ê,Ë,Û,Ù,Ï,Î,À,Â,Ô,è,é,ê,ë,û,ù,ï,î,à,â,ô,ç";
 System.out.println(AsciiUtils.convertNonAscii(s));
//output : 
//The result : E,E,E,E,U,U,I,I,A,A,O,e,e,e,e,u,u,i,i,a,a,o,c
 }
}

JDK 1.6提供了可以用于这里任务的java.text.Normalizer 类。

请参见这里的示例

原作者:
0 0

原始请求已经被答复。

但是,我正在为那些可能正在寻找通用音译代码的人发布下面的答案,以便将任何字符集翻译成 Java/英文。

tranliteration的天真含义:翻译的字符串是 final 形式/目标字符集类似于它的原始形式。 如果我们想将任何字符集音译到拉丁文( 英文字母表),那么 ICU4 ( java中的ICU4J库) 会做这个工作。

下面是java代码 Fragment:


 import com.ibm.icu.text.Transliterator;//ICU4J library import

 public static String TRANSLITERATE_ID ="NFD; Any-Latin; NFC";
 public static String NORMALIZE_ID ="NFD; [:Nonspacing Mark:] Remove; NFC";

/**
 * Returns the transliterated string to convert any charset to latin.
 */
 public static String transliterate(String input) {
 Transliterator transliterator = Transliterator.getInstance(TRANSLITERATE_ID +";" + NORMALIZE_ID);
 String result = transliterator.transliterate(input);
 return result;
 }

...