miau's blog?

UTF-7

bcp で引っかかった部分のひとつに「フォーマットファイルのフォーマットが正しくありません」みたいなのがありました。
結局文字コードが違うっていうオチだったんですけど・・・まぁその辺りの話。




(長い前置き。読み飛ばしたほうが吉)

フォーマットファイルの記述が正しくない、と言われたので、
type C:\table01.fmt とかやって内容を見てみたわけです。

すると、


8.0
28
1 SQLCHAR 0 8 "\r\n" 1 date ""
2 SQLFLT8 0 8 "\n" 2 f_alpha_0 ""
:

こうなっているはずのところが、


8.0
28
1 SQLCHAR 0 8 +ACIAXA-r+AFw-n+ACI- 1 date +ACIAIg-
2 SQLFLT8 0 8 +ACIAXA-n+ACI- 2 f+AF8-alpha+AF8-0 +ACIAIg-
:

こんなことになってたり。
・・・なにこれ。


今回は、localhost → 中継用 FTP サーバ → DB サーバ と二回の転送を挟んで bcp を実行していたんですが。
中継用 FTP サーバまでの内容はちゃんと表示できてるみたいだから、その先でデータが破損してるとか?

と、いろいろ考えつつ文字化けデータを眺めてみると・・・どうも記号の部分が「+」と「-」に挟まれて変に表示されてる様子。
ためしに「+ACI-」とか「+AF8-」とかでググってみると、なんかメールの内容とかがヒット。
ソースにはちゃんとその文字列が含まれるのに、HTML 上では表示されてない・・・?

というところで、フォーマットファイルを開いてるサクラエディタをよく見てみると。
右下に「UTF-7」って表示されてる!

・・・ああ、どこかで間違って Ctrl+Shift+F7 とか押しちゃったのかな・・・。


にしてもよりによって、UTF-7 とは。
ShiftJIS とか EUC-JP だったらそもそも 7bit-ASCII な文字はそのまま保たれるし、Unicode-BE なら type したときにわかる。
Unicode や UTF-8 ならたぶん SQLServer でもちゃんと認識されるわけで・・・ってこの方がタチ悪いか。

それにしても、UTF-7 ってどんなだろう?
7bit-ASCII な文字までエスケープ処理(?)してしまう文字コードってのも珍しい気がする。
と、気になったので調べてみました。

(長い前置き おわり)


UTF-7 の公式文書はたぶんこれ。

RFC 2152 (rfc2152) - UTF-7 A Mail-Safe Transformation Format of Unicode

なるほど。Mail-Safe Transformation と。
それで記号をエスケープする必要があるのか。

で、まぁ RFC に書いてる通りなんだけど、要点だけ説明を。

まず、説明しやすいように文字のセットが規定されてる。

・Set D (directly encoded characters)
 [A-Za-z0-9'(),-./:?]

・Set O (optional direct characters)
 [!"#$%&*;<=>@\[\]^_'{|}]

・Set B (Modified Base 64)
 [A-Za-z0-9+/]
 (Base64 で使われる文字。pad 用の「=」は除く)

で、

・Set D に含まれる文字はそのまま ASCII な文字に置き換えられる
・Set O に含まれる文字は、条件によってはそのまま ASCII な文字に置き換えられる
・それ以外の文字は、BASE64 でエンコード(Set B の文字で置き換え)して、「+」と「-」で囲んでやる。
・「+」を表したい場合は「+-」と表記する

みたいな感じで処理、と。


なるほどな感じで勉強になった。
同じようにハマってしまう人もいるかもしれないから、エンコードが必要な 7-bit ASCII 1文字に関して対応表を書いておこう。


! → +ACE-
" → +ACI-
# → +ACM-
$ → +ACQ-
% → +ACU-
& → +ACY-
* → +ACo-
+ → +-
; → +ADs-
< → +ADw-
= → +AD0-
> → +AD4-
@ → +AEA-
[ → +AFs-
\ → +AFw-
] → +AF0-
^ → +AF4-
_ → +AF8-
` → +AGA-
{ → +AHs-
| → +AHw-
} → +AH0-
~ → +AH4-
posted at 20:08:42 on 2005-08-21 by miau - Category: Work No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。