sql >> Databáze >  >> RDS >> Mysql

Jak odstranit špatné znaky, které nejsou vhodné pro kódování utf8 v MySQL?

Když jsem měl problém jako tento, použil jsem skript Perl, abych zajistil, že data budou převedena na platné UTF-8 pomocí kódu, jako je tento:

use Encode;
binmode(STDOUT, ":utf8");
while (<>) {
    print Encode::decode('UTF-8', $_);
}

Tento skript používá (pravděpodobně poškozené) UTF-8 na stdin a znovu vytiskne platné UTF-8 na stdout . Neplatné znaky jsou nahrazeny (U+FFFD , Nahrazující znak Unicode ).

Pokud spustíte tento skript na dobrém vstupu UTF-8, výstup by měl být identický se vstupem.

Pokud máte data v databázi, má smysl použít DBI ke skenování vašich tabulek a pročištění všech dat pomocí tohoto přístupu, abyste se ujistili, že vše je platné UTF-8.

Toto je jednořádková verze stejného skriptu v Perlu:

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

UPRAVIT:Přidáno pouze řešení Java .

Toto je příklad, jak to udělat v Javě:

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: Пр?вет
    }
}


  1. Mezipaměť:Co to je a jak to ovlivňuje výkon databáze?

  2. Seznam prvků číselného formátu v Oracle

  3. Jak otevřít tabulku v návrhovém zobrazení v aplikaci Access

  4. Alternativy k LIMIT a OFFSET pro stránkování v Oracle