java mysql replace_java – 如何清除不适合MySQL中utf8编码的坏字符?

当我遇到这样的问题时,我使用Perl脚本来确保使用如下代码将数据转换为有效的UTF-8:

use Encode;

binmode(STDOUT,":utf8");

while (<>) {

print Encode::decode('UTF-8',$_);

}

该脚本在stdin上占用(可能已损坏)UTF-8,并将有效的UTF-8重新打印到stdout.无效字符被替换为 (U FFFD,Unicode replacement character).

如果您在良好的UTF-8输入上运行此脚本,输出应与输入相同.

如果您在数据库中有数据,使用DBI扫描表格并使用此方法清理所有数据,以确保所有内容都是有效的UTF-8是有意义的.

这是同一脚本的Perl一线版本:

perl -MEncode -e "binmode STDOUT,':utf8';while(<>){print Encode::decode 'UTF-8',\$_}" < bad.txt > good.txt

编辑:添加仅Java解决方案.

这是一个在Java中如何做到这一点的例子:

import java.nio.ByteBuffer;

import java.nio.CharBuffer;

import java.nio.charset.CharacterCodingException;

import java.nio.charset.Charset;

import java.nio.charset.CharsetDecoder;

import java.nio.charset.CodingErrorAction;

public class UtfFix {

public static void main(String[] args) throws InterruptedException,CharacterCodingException {

CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();

decoder.onMalformedInput(CodingErrorAction.REPLACE);

decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);

ByteBuffer bb = ByteBuffer.wrap(new byte[] {

(byte) 0xD0,(byte) 0x9F,// 'П'

(byte) 0xD1,(byte) 0x80,// 'р'

(byte) 0xD0,// corrupted UTF-8,was 'и'

(byte) 0xD0,(byte) 0xB2,// 'в'

(byte) 0xD0,(byte) 0xB5,// 'е'

(byte) 0xD1,(byte) 0x82 // 'т'

});

CharBuffer parsed = decoder.decode(bb);

System.out.println(parsed);

// this prints: Пр?вет

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值