2017-01-10 19 views
6

MySQLのutf8 character setでサポートされていない文字列から文字を削除するにはどうすればよいですか?つまり、MySQLのutf8mb4 character setでのみサポートされている ""などの4バイトの文字です。例えばMySQLのutf8文字セットでサポートされていない文字を削除するにはどうしたらいいですか?

C = -2.4‰ ± 0.3‰; H = -57‰ 

は私がCHARSET=utf8を持っているMySQLのテーブルにデータファイルをロードしたい

C = -2.4‰ ± 0.3‰; H = -57‰ 

になるはずです。

+0

私はあなたが求めていることを聞いていますが、なぜ列を 'CHARACTER SET utf8mb4'に変換しないのですか? –

答えて

9

MySQLのutf8mb4エンコーディングは、世界がUTF-8と呼ぶものです。

MySQLのutf8エンコーディングはBMP(文字U + 0000〜U + FFFFを意味します)の文字のみをサポートするUTF-8のサブセットです。

Reference

ので、以下は、問題のサポートされていない文字にマッチします:

1:ここでは

/[^\N{U+0000}-\N{U+FFFF}]/ 

はあなたの入力をきれいに使用できる3つの異なる技術であるサポートされていない文字を削除します。

s/[^\N{U+0000}-\N{U+FFFF}]//g; 

2:Re

s/[^\N{U+0000}-\N{U+FFFF}]/\N{REPLACEMENT CHARACTER}/g; 

3:U + FFFDでサポートされていない文字を配置変換マップ使用してサポートされていない文字を置き換えます。たとえば、

my %translations = (
    "\N{MATHEMATICAL ITALIC SMALL EPSILON}" => "\N{GREEK SMALL LETTER EPSILON}", 
    # ... 
); 

s{([^\N{U+0000}-\N{U+FFFF}])}{ $translations{$1} // "\N{REPLACEMENT CHARACTER}" }eg; 

use utf8;        # Source code is encoded using UTF-8 
use open ':std', ':encoding(UTF-8)'; # Terminal and files use UTF-8. 

use strict; 
use warnings; 
use 5.010;    # say, // 
use charnames ':full'; # Not needed in 5.16+ 

my %translations = (
    "\N{MATHEMATICAL ITALIC SMALL EPSILON}" => "\N{GREEK SMALL LETTER EPSILON}", 
    # ... 
); 

$_ = "C = -2.4‰ ± 0.3‰; H = -57‰"; 
say; 

s{([^\N{U+0000}-\N{U+FFFF}])}{ $translations{$1} // "\N{REPLACEMENT CHARACTER}" }eg; 
say; 

出力:

C = -2.4‰ ± 0.3‰; H = -57‰ 
εC = -2.4‰ ± 0.3‰; εH = -57‰ 
+0

私が正しく理解すれば、正規表現を適用する前に、utf8文字(たとえば、4バイトのchar "")をBMPに変換する必要があります。これを行う関数はありますか? –

+1

""をBMPに変換することが何を意味するのか分かりません。 BMPは ""を含まない文字の集合です。 BMPの外にある文字のBMP内部の文字へのマッピングを作成することができます。私はちょうど私の答えにこれのデモンストレーションを追加しました。 – ikegami

+0

あなたのコメントのためにありがとう、しかし私は何か他の意味:あなたの正規表現を使用して4バイトutf8の文字を削除したいと思います[^ \ N {U + 0000} - \ N {U + FFFF}] // g;私のファイル(BMP表現の代わりに ""を含む)にそれを適用すると、4バイトの文字は除外されません。 –

関連する問題