えーと、変換後がUCS-2とかだとマズいかな? …(実験中)… 試作パッチ以前に、Connector/Jでcharacter_set_server=ucs2のサーバに繋がらないんですけど。 Connector/J側でcharacterEncoding=UTF-8などとしておけば繋がりますが、こんな仕様あったかな…。
そもそもucs2は現在クライアントキャラクタセットとしては使えないんじゃないでしょうか。
UCS-2 cannot be used as a client character set, which means that SET NAMES 'ucs2' does not work. (See Section 9.1.4, “Connection Character Sets and Collations”.)
ちなみにUCS-2とかUTF-16のようにASCIIな部分までマルチバイトなキャラクタセットが使えるとなると、Cのmysql_real_escape_stringも問題が発生しそうですね。マルチバイトはエスケープ対象外という処理でShift_JIS(やGBK)の5c問題を解決しているようなので。これは現在のサポート文字セットに依存した脆弱な実装ということになるんでしょうか。
そんな時代がくるのか分かりませんが、perl的にUTF-16時代の正しいescape処理を考えてみるとこんな感じ?
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
# from DBD::mysqlPP::quote
my @quote_target = (
"\\" => '\\\\',
"\0" => '\\0',
"\n" => '\\n',
"\r" => '\\r',
"'" => q{\\'},
'"' => '\\"',
"\x1a" => '\\Z',
);
my $str = "I'm sorry\nok.";
print quote($str, 'utf-16LE');
sub quote {
my ($str, $charset) = @_;
my %quote_target_for_charset = map { Encode::encode($charset, $_) } @quote_target;
$str =~ s{
(.)
}{
my $bytes = Encode::encode($charset, $1);
$quote_target_for_charset{$bytes} // $bytes;
}exmsg;
return $str;
}
Yen markのhtmlでのエスケープもなんかへんな感じになってるのでファイルごとup
1文字ずつencodeしてるのはなんかやーなかんじですね。試してないけどRubyだと$KCODEの切り替えを使うとencode的な事は1回で済むのかも。あとで試してみよう。
- 新しい: mysqlのパーサのわからないところ
- 古い: 年末年始にやることりすと
コメント:0
トラックバック:0
- この記事のトラックバック URL
- https://blog.everqueue.com/chiba/2008/12/29/35/trackback/
- トラックバックの送信元リスト
- UTF-16時代のエスケープ処理 - へぼい日記 より