|
kabe さん、こん**は。HidemiOya です。
>(1) SQL 文側では「hex("日本語文字列")」と書いておくと、この部分を「hex十六進文字列」にエンコードする
>(2) エラー表示/フィールド名表示の際には「hex十六進文字列」を「日本語文字列」にデコードする
これに基づいたエンコード/デコード関数を作成しましたので、組み込みをお願いします。SQLite の本家サイトを探したんですが、フィールド名の最大長が分かりませんでした。長くなりすぎないように ShiftJIS の文字列をエンコードしていますが、もしかしたら文字数制限に引っかかるかも…。
エンコード/デコードルーチンで、AnsiToUtf8/Utf8ToAnsi も行ってしまいます。また、エンコード時に「hex("日本語文字列")」、デコード時に「hex十六進文字列」を含まない文字列はほとんどオーバーヘッドなくオリジナル文字列をそのまま返します。ってことで、SQLite に SQL 文を渡す際には現在の AnsiToUtf8 関数の代わりに EncodeHex を、エラー表示やフィールド名表示の際は Utf8ToAnsi 関数の代わりに DecodeHex を常に使ってもらって問題ありません。
なお、テンプレートの「jp_[field]」の部分は、「hex("[field]")」に変更する必要があります。
function EncodeHex(src: string): string;
var
t, h: string;
p: PChar;
begin
RegExprModifierI := true;
RegExprModifierS := true;
Result := ReplaceRegExpr('hex\(\s+("[^"]*")\s+\)', AnsiToUtf8(src), 'hex($1)', true);
while ExecRegExpr('hex\("[^"]+"\)', Result) do begin
t := ReplaceRegExpr('.*?hex\("([^"]+)"\).*', Result, '$1', true);
p := PChar(Utf8ToAnsi(t));
h := '';
while p^ <> #0 do begin
h := h + IntToHex(Ord(p^), 2);
Inc(p);
end;
Result := ReplaceRegExpr('hex\("' + t + '"\)', Result, 'hex' + h, false);
end;
end;
function DecodeHex(src: string): string;
type
THex2 = array[0..1] of char;
PHex2 = ^THex2;
var
t, s: string;
p: PChar;
begin
RegExprModifierI := true;
RegExprModifierS := true;
// Result := src;
Result := Utf8ToAnsi(src);
while ExecRegExpr('hex[0-9a-f]+', Result) do begin
t := ReplaceRegExpr('.*?hex([0-9a-f]+).*', Result, '$1', true);
p := PChar(t);
s := '';
while p^ <> #0 do begin
s := s + Chr(StrToInt('$' + PHex2(p)^));
Inc(p, 2);
end;
// Result := ReplaceRegExpr('hex' + t + '([^0-9a-f])', Result, AnsiToUtf8(s) + '$1', true);
Result := ReplaceRegExpr('hex' + t + '([^0-9a-f])', Result, s + '$1', true);
end;
// Result := Utf8ToAnsi(Result);
end;
|
|