-2

我在报告显示名称时遇到问题。我的应用程序使用不同的技术 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 在报告中显示数据之前转换数据。为了转换上述数据库存储值,我尝试通过 Java 步骤转换数据,如下所示

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

但它没有正确转换值,在上述 2 个错误值中,只有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 代码无法正确转换,尽管我使用了正确的编码/解码方案,其他任何我遗漏的或我的方法都是错误的。

4

1 回答 1

0

正如我们所见,将您的数据库中的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);
于 2016-08-03T13:07:55.227 回答