生成格式错误的字符串以进行测试

时间:2014-08-12 18:11:50

标签: java php mysql utf-8 character-encoding

我正在使用并贡献一个库(https://github.com/neitanod/forceutf8)来修复我们系统中的编码问题,并保证在向用户显示任何编码问题之前将其透明地修复。

我需要一些测试用例,我想要的是一个接受UTF-8字符串并将其转换为格式错误的字符串的函数。然后我可以通过我的库运行它以确保它正确修复它:

// psuedocode
strings = [ '공', '人', '', 'passé' ];

foreach ( string in strings )
    malformed = garble( string )
    print( string + " => " + malformed + "\n" )

以下是格式错误字符串的一些示例:

  • "人" --> 人
  • "ð´ " --> (在Safari中使用红球)

这是原始十六进制数据:

<?php
$strings = array( "人", "人", "ê³µ", "공", "ð´", "" );
foreach ( $strings as $string )
    echo " '$string' \t => '" . unpack( "H*", $string )[1] ."'\n";
?>

输出:

  • '人' => 'c3a4c2bac2ba'
  • '人' => 'e4baba'
  • 'ê³µ' => 'c3aac2b3c2b5'
  • '공' => 'eab3b5'
  • 'ð´' => 'c3b0c29fc294c2b4'
  • '' => 'f09f94b4'

您可以看到 e4 ba ba ,其中的字符可以在错误的字符串中找到,在几个 c2 之间,如下所示:

  • c3a 4 c2 ba c2 ba

我希望这很清楚。

可以生成字符串的一种方法是将它们插入MySQL,然后将它们取出。

1 个答案:

答案 0 :(得分:0)

您可以错误地对字符串进行编码和编码,如下所示:

import org.apache.commons.codec.binary.StringUtils;

[..]

private static void malformedStringTest() {
    byte[] utf8bytes = StringUtils.getBytesUtf8(
              "This is a test\n" 
            + "人 人 ê³µ 공 ð´ \n"
            + "The above won't work.");
    String asciistring = StringUtils.newStringUsAscii(utf8bytes);

    System.out.println(asciistring);
}

它会输出:

This is a test
������ ��� ������ ��� ���� ����
The above won't work.

您可以调整此代码以逐个测试每个字符串。

另请参阅org.apache.commons.codec.binary.StringUtils的其他静态方法。