2012-11-12 38 views
1

我一直在努力,做如下的情景:的Java:建议对字符集转换

  1. 获取Unicode格式输入数据; [UTF-8]
  2. 转换为ISO-8559;
  3. 检测&替换不支持的编码字符; [基于用户定义的键值对]

我的问题是,我一直在试图找到有关ISO-8559深入的信息,但没有运气。有人碰巧对此有更多了解吗?这个与ISO-8859有什么不同?任何细节都会很有帮助。其次,除了保留ISO-8559的要求之外,我继续编写程序将输入数据转换为Java中的ISO-8859。虽然我能够使用基于字符的替换来实现所需的功能,但是当数据量很大时,显然这似乎很耗时。 [in MBs]

我相信肯定有更好的方法来做到这一点。有人可以提醒我吗?

+2

[ISO 8559](http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=15821)似乎与不同的领域有关。 – ShyJ

+0

它看起来是如此。我发现更多关于ISO-8559 [这里](http://actuel.fr.selfhtml.org/archives/docu/7.0/thb.htm) – Srii

+2

@Srii:不,这是一个简单的(但非常一致的)错字。而且我非常肯定,谁给了你这个任务的人也犯了错误。 ISO-8559与字符集无关,而ISO-8859是该领域非常普遍的规范。我敢打赌他们*表示ISO-8859的真钱。 –

回答

2

我假设你想要将UTF-8转换为ISO-8859 -1,即西文拉丁文-1。网络中有很多字符集表。

  1. 一般的Web浏览器和Windows,这将是更好地转化为Windows的1252,这是一个扩展重新定义范围0x80的 - 为0xBF,undermore有如图在MS Word中的特殊报价。即使在Mac上,浏览器也可以在ISO-559-1中解释这些代码。

  2. Java标准转换如new OutputStreamWriter(new FileOutputStream("..."), "Windows-1252")已经很多了。您可以编写一种过滤器,或者查找未翻译的特殊字符?。你可以用翻译的口音无法在Windows 1252拉丁字母为ASCII字母:

    String s = ... 
        s = Normalizer.normalize(s, Normalizer.Form.NFD); 
        return s = s.replaceAll("\\p{InCombiningDiacriticalMarks}", ""); 
    
  3. 对于其他脚本像印地文或西里尔字母的关键字搜索是音译

+0

感谢Joop,规范化程序类似乎取代了所有的DiacriticalMarks,而我只想根据链接到程序的属性文件替换一组少数字符。由于翻译失败而产生的问号变成了一个常见的符号,因此包含要替换的值的属性文件将被替换为无效值。 例如:如果数据包含SÄSSSSS,翻译可能是这样的结果:S?S?S?S?S。属性文件中定义的公式,Ä= A&ö= o实现变得几乎困难。可能是我错了,但我很高兴能够纠正。 – Srii

+1

+1从欧洲的角度来看:ISO-8859-1最大的缺点是它不包含符号。但'Windows-1252'确实。 –

+1

@FabianBarney:与ISO-8859-15一样。 –