Skip navigation.

Error Log

最近電車ばっかり…

Posts tagged with "unicode"

全角+半角チェック

,

久しぶりにソフトウェア開発の話、・・・精神的にかなり痛い話です。

今の開発は、社内向けのシステム(SOA ベース)の改造案件です。別システムから SOAP で送られてきたデータに対して「型桁チェック」というものをやっています。今回の開発で、とある項目A(他多数)の型桁チェック仕様を「全角文字を許容」から「全角+半角文字を許容」に変更していました。

今日になって、「項目A に改行を入れると型桁チェックエラーを返すようになった」という申告が。。。


大規模開発ならではの特徴なのですが、「基盤」というフレームワーク+αを設計・実装するチームと、「業務」という実際の Web アプリケーションを設計・実装するチームに分かれて開発します。そして、全角文字チェックは基盤チームからクラスが提供され、全角+半角チェックは業務チームの方で作成しています。
# 僕は業務チームの方です。

嫌な予感を感じつつ、ソースを見ることに。
  • 全角+半角チェック: 全ての文字が U+0020~007F、U+00A0~FFFF であれば OK。
  • 全角チェック: 全ての文字が U+0021~007F(ASCII)以外、かつ U+FF60~FFA0(半角カナ)以外であれば OK。
・・・ブラックリスト方式かよ! しかも制御文字(U+0000~U+001F, U+0080~U+00A0)を通すんかい!!


リリースまで時間がないため、全角+半角チェックのデグレ扱いになり改修をすることになりました。


・・・しかし「この全角チェックに半角も許容するとなると、どの文字を非許容にすればいいんだ!」という話が。とはいえ、全角+半角チェックの呼び出しをしないようにする、という対処は修正量が多いので、この時期にはきついという話も。

結局、全角+半角チェックは「全ての文字を許容する」チェックに修正することになりました。えぇ、return true 1行ですとも。そして、「改行で型桁チェックエラーになる」というバグが改修されたことを、結合試験レベルで確認することに(爆。

・・・気分最悪です。

続、円記号に気をつけろ

, ,

円記号が U+00a5 になっていたメールのソースを確認しました。

結論: U+00a5 にしたのは Opera。


問題のメールは Outlook(Exchange) から送信されており、メッセージソース上は何も問題ない ISO-2022-JP のメールでした。円記号もソース中は \x5c でした。

・・・しかし、何かが違うようです。

このメッセージソースを Peggy で別名保存して Opera にインポートさせると、U+00a5 への変換をしなかったのです。・・・んんん??
さらに不思議なことに、Peggy で別名保存したメッセージソースと、オリジナルのメッセージソースとの diff を取ると、目視では違いのない差分が示されました。

両者の違いは、マルチバイト文字列の後「ここからは英数字です」を意味するエスケープシーケンスでした。
オリジナルのメッセージソースでは、「ESC "(" "7" (ここからは JIS X 0201)」です。
一方で Peggy で保存したメッセージソースは、「ESC "(" "B" (ここからは ASCII)」です。


なるほど、Opera はこんな細かいところに(忠実に?)反応していました。
確かに、JIS X 0201 では文字コード \x5c は円記号なので、これを UNICODE にマッピングすると U+00a5 の円記号が妥当でしょう。
ASCII では文字コード \x5c はバックスラッシュなので、これを UNICODE にマッピングすると U+005c のバックスラッシュが妥当でしょう。
しかし、Windows はそんなのドン無視で、ASCII だろうと JIS X 0201 だろうと \x5c は U+005c にマッピングされます。
(バックスラッシュとして見えるか、円記号として見えるかは、フォント次第(--; )

というわけで、Opera の忠実?な対応が裏目に出てしまった格好です。


考えてみると、\x5c を円記号とみなしたで考えたのが久しぶりのような気がします。
Peggy では、\x5c をバックスラッシュとして表示するフォントを使ってますし、円記号で表示されるフォントで見ても、人と話すときは常に「ばくすら」ですから。。。

円記号に気をつけろ

, ,

メールに書かれているバスが「存在しない」って言われる現象に出くわすことがあります。順にディレクトリを下っていくと確かに存在しているのに。Peggy に一旦貼り付けてクリップボードにコピーし直すと、このエラーが発生しなくなります(他のエディタでも多分同じ結果でしょう)。不思議。

その原因が、これ。

円記号の字形を持った文字がコード U+005c と U+00a5 の二カ所にあるよ…って問題。

見事にやられました。
僕が受け取ったメールは、ディレクトリ区切りがすべて a5 の円記号になっていたのです。
Windows が UNICODE の U+00a5 を Shift_JIS の \x005c にマッピングしている様で、UNICODE 非対応エディタに貼り付けると、U+00a5 の円記号がすべて \x5c の円記号/バックスラッシュに置換されていたのでした。
# 逆に Shift_JIS の \x005c は UNICODE の U+005c にマッピングされるのに…。

僕は、拙作 ShellExecute で開くコマンド を使っていたので、「円記号をファイル名・ディレクトリ名に使うやつはおらんだろ」と言う発想で、ShellExecute.wsf に U+00a5 → U+005c 変換を加えて対処しました。
… ほんとにおらんのか?ためしに、U+00a5 の円記号を使ったディレクトリ・ファイルを作ってみました。

… できてしまった。(下のファイル名は、全角の円記号「¥」を使った場合)

このファイルは、Peggy で開くことができませんでした。パスが存在しないって。UNICODE に対応していないアプリケーションには、\x005c に変換された(実在しない)パスが渡されるんですから、当然の結果です。
日本語版 Windows を使っている人たちにとっては、ディレクトリ区切り文字は(\x005c の文字ではなく)円記号なのですから、U+00a5 の円記号もディレクトリ区切りとして扱って… せめてファイル名の禁止文字に入れてくれればいいのに。

… ということで、「円記号に気をつけろ」という増やしたくない知見が増えるのでした。。。
December 2009
M T W T F S S
November 2009January 2010
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31