3

UTF8 が無効な RSS フィードを YouTube から取得しています。を使用して同様のルビ文字列を作成できます

bad_utf8 = "\u{61B36}"
bad_utf8.encoding # => #<Encoding:UTF-8>
bad_utf8.valid_encoding? # => true

Ruby はこれが有効な UTF-8 エンコーディングであると考えていますが、そうではないことは確かです。

Mysqlと話すと、次のようなエラーが発生します

require 'mysql2'
client = Mysql2::Client.new(:host => "localhost", :username => "root")
client.query("use test");

bad_utf8 = "\u{61B36}"
client.query("INSERT INTO utf8 VALUES ('#{moo}')")

# Incorrect string value: '\xF1\xA1\xAC\xB6' for column 'string' at row 1 (Mysql2::Error)

MySQL に送信する前に、これらの無効なタイプのエンコーディングを検出または修正するにはどうすればよいですか?

4

2 に答える 2

2

以下も可能であるため、Ruby の組み込み String.valid_encoding? には依存しません。

irb
1.9.3-p125 :001 > bad_utf8 = "\u{0}"
 => "\u0000" 
1.9.3-p125 :002 > bad_utf8.valid_encoding?
 => true 
1.9.3-p125 :003 > bad_utf8.encoding
 => #<Encoding:UTF-8>

これは有効な UTF-8 (参照: https://en.wikipedia.org/wiki/Utf8 ) ですが、文字列に NULL 文字が存在することは、多くの場合、以前の変換エラーのヒントであることがわかりました (たとえば、 html ページで見つかった無効なエンコーディング情報)。

「Modified UTF-8」用の独自の検証関数を作成しました。これは、検証を Basic Multilingual Plane (0x1-0xffff) に制限するための :bmp_only オプションを使用できます。これは、ほとんどの最新の言語で十分なはずです (参照: https://en.wikipedia.org/wiki/Unicode_plane )。

ここでバリデーターを見つけてください: https://gist.github.com/2295531

于 2012-04-03T21:20:34.553 に答える
1

おそらく、MySQL が「utf8」文字セットで許可する唯一の文字である基本的な多言語面にコード ポイントが存在しないためです。

新しいバージョンの mysql には、「utf8mb4」と呼ばれる別の文字セットがあり、BMP 以外の Unicode 文字をサポートしています。

しかし、おそらくそれを使用したくないでしょう。ユースケースを慎重に検討してください。BMP 以外の文字を使用する実際の人間の言語 (存在する場合) はほとんどありません。

于 2011-05-09T06:44:51.117 に答える