我正在使用并贡献一个库(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 之间,如下所示:
我希望这很清楚。
可以生成字符串的一种方法是将它们插入MySQL,然后将它们取出。
答案 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的其他静态方法。