将值转换为UTF-8时的问题


Issues in Converting values to UTF-8

我在报告显示名称时遇到问题。我的应用程序使用不同的技术PHP、Perl和BI Pentaho。

我们使用MYSQL作为数据库,我的表是CHARSET=utf8

我的表存储的行中的值如下,这是错误的

Row1 = Ãx—350
Row2 = Ñz–401

PHP和Perl使用不同的内置函数来转换存储在DB中的上述值,并在UI中显示如下,这是正确的

Expected Row1 = Áx—350
Expected Row2 = Ñz–401

谈到使用pentaho的报告,我使用ETL在报告中显示数据之前转换数据。为了转换上面的DB存储值,我试图通过Java步骤转换数据,如下所示

new java.lang.String(new java.lang.String(CODE).getBytes("Windows-1252"), "UTF-8") 

但它没有正确转换值,在以上两个错误值中,只有Row2值被正确转换,但第一个Row1被错误转换为低于

Converted Row1 = �?x—350
Converted Row2 = Ñz–401

请建议我可以正确转换值的方法,例如Row1值应正确转换为Áx-350

我写了一个小Java程序,如下所示,将Áxâ€"350字符串转换为Áx--350

String input = "Ãx—350";
byte[] b1 = input.getBytes("Windows-1252");
System.out.println("Input Get Bytes = "+b1.toString());
String szUT8 = new String(b1, "UTF-8");
System.out.println("Input Encoded = " + szUT8);

上述代码的输出如下

Input Get Bytes = [B@157ee3e5
Input Encoded = �?x—350-350—É1

如果我们看到输出,那么字符串是错误的,实际预期输出是Áx--350

为了确认编码/解码方案,我尝试在线测试字符串,并使用字符串Áxâ€"350进行测试,结果如预期áx--350,这是正确的。

因此,从这一点出发,请指出为什么尽管我使用了正确的编码/解码方案,但java代码无法正确转换,我缺少的任何其他内容或我的方法都是错误的。

正如我们所看到的,数据库中的CHARSET设置被设置为utf-8并不一定意味着那里的数据在utf-8中得到了正确的编码(甚至在utf-8中)。看起来你在处理mojibake——这些字符曾经使用错误的编码方案解码,然后反过来又编码错误。修复这一问题通常是一个乏味的过程,需要找出过去的解码/编码错误,然后将其消除。

长话短说:如果你有mojibake,你就无法进行任何自动转换,除非你知道(或能够弄清楚)过去进行了哪些转换。

转换是一个先解码,然后编码的问题。要在Perl中转换:

my $string = "some windows-1252 string";
use Encode;
my $raw = decode('windows-1252',$string);
my $encoded = encode('utf-8',$raw);