2012-04-17 76 views
4

我有以下字符。将拉丁字符转换为Java中的普通文本

一个¢¥ŚŠŞŤŹŽŻąľśšşťźžżÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ

我需要转换为

AcYSSSTZZZalssstzzzAAAAAAACEEEEIIIIDNOOOOOOUUUUYTSaaaaaaaceeeeiiiionoooooouuuuyty

我使用Java 1.4。

Normalizer.decompose(text,true,0).replaceAll( “\ p {InCombiningDiacriticalMarks} +”,“”);只用符号替换字符。

类似¢ÆÐÞßæðøþ的字符没有被转换。

我该怎么做,在JDK 1.4中进行转换的有效方法是什么?

请帮忙。

问候, 诗丽黛玮·阿雅潘

+1

Y并不等于¥ - 考虑¥意味着“元”。你可能需要实现一个查找表,因为@ stephen -c建议 – Deco 2012-04-17 09:37:35

+0

我需要帮助来形成查找表并从查找表中获取等效字符。我可能不希望查找表包含¥,我可能想存储unicode等价物并将其转换为Y. – 2012-04-17 09:40:26

+0

与@Deco同意,只是添加到主题中,我不认为ß等价于S或者......至少在德语中它相当于SS,将“Strasse”替换为“Strasse”而不是“Strasse”就是错误的。 – Fredrik 2012-04-17 09:43:59

回答

3

我如何能做到这一点,什么是做转换在JDK 1.4的有效途径。

最有效的方法是使用实​​现为数组或HashMap的查找表。但是,当然,你需要填充表格。

类似¢ÆÐÞßæðøþ的字符没有被转换。

那么没有那些字符真的是罗马字母,不能被翻译成罗马字母......没有采取过分的语义自由。例如:

  • ¢和¥是货币符号,
  • AE和E是连字在某些语言中代表两个字母,而在另一些鲜明的一封信,
  • SS是一个德国表示双S。
+0

查找表应该如何?我不想用特殊字符保存查找表,因为有些编辑器不支持这些查询,我可以在查找中放置等效的unicode字符,如果是,代码应该如何?我必须从查找表中获取unicode字符,以及如何将其转换为正常文本? – 2012-04-17 09:38:17

+0

我以为'char []'会比HashMap更高效。 ;) – 2012-04-17 09:54:19

+0

@PeterLawrey - 它取决于输入集的大小,以及您是在优化空间还是时间。 – 2012-04-17 11:06:08

2

我会做这样的事情;

更新的Java 1.4中(除去仿制药)

public class StringConverter { 

    char[] source = new char[]{'Ą', '¢', '¥', 'Ś'}; // all your chars here... 
    char[] target = new char[]{'A', 'c', 'Y', 'S'}; // all your chars here... 
    //Build a map 
    HashMap map; 

    public StringConverter() { 
     map = new HashMap(); 
     for (int i = 0; i < source.length; i++) { 
      map.put(new Character(source[i]), new Character(target[i])); 
     } 
    } 

    public String convert(String s) { 
     char[] chars = s.toCharArray(); 
     for (int i = 0; i < chars.length; i++) { 
      chars[i] = map.get(chars[i]); 
     } 
     return new String(chars); 
    } 

} 
+0

我正在使用JDK 1.4,我不想存储特殊字符作为默认CP1252编码的eclipse支持。 – 2012-04-17 09:48:18

+3

Eclipse的默认编码和Java版本之间的连接是什么?您可以将Eclipse中的默认编码更改为UTF-8,并且它仍然可以工作。 – Sorin 2012-04-17 09:51:43

+0

谢谢。我已经提到了Java 1.4的HashMap map。 – 2012-04-17 09:54:07

6

退房的ICU project,尤其是ICU4J部分。 Transliterator类将解决您的问题。

下面是一个例子的Transliterator,其将任何脚本以拉丁字符,并删除任何修饰和非ASCII字符:

Transliterator accentsConverter = Transliterator.getInstance("Any-Latin; NFD; [:M:] Remove; NFC; [^\\p{ASCII}] Remove"); 

Any-Latin部执行转换,NFD; [:M:] Remove; NFC去除口音和[^\\p{ASCII}] Remove去除任何非-ascci字符剩余。

您只需拨打accentsConverter.transliterate(yourString)即可获得结果。

您可以阅读更多关于如何在ICU Transformations guide中构建转换标识(参数Transliterator.getInstance)的信息。

+0

但我想做一个转换示例¥是指Y. – 2012-04-17 09:47:26

+0

像@Deco在评论中提到的,¥到Y不是正确的转换。但是,对于这些特殊需求,您可以创建预期转换的映射,然后首先映射到这些映射,然后将其传递给ICU。 – Sorin 2012-04-17 09:50:48

相关问题