C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: SJIS機種依存文字をunicode変換したい。


(過去ログ 119 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■69849 / inTopicNo.1)  SJIS機種依存文字をunicode変換したい。
  
□投稿者/ ひよこ (1回)-(2014/02/02(Sun) 10:47:10)

分類:[JavaScript] 

こんにちわ。

SJISの機種依存文字(半角カナ文字エリア 00A0〜00FF 、特殊文字エリア 8540〜889E 、縦文字エリア EB40〜EFFC 、外字エリア F040〜 )を
javascriptのcharCodeAt()で弾かせたいと思っています。charCodeAt()はunicodeを返します。

SJISのコードをunicodeのコードに変換するにはどうしたらいいのでしょうか?

参考URL
http://www.shurey.com/js/labo/character2.html
引用返信 編集キー/
■69865 / inTopicNo.2)  Re[1]: SJIS機種依存文字をunicode変換したい。
□投稿者/ 魔界の仮面弁士 (521回)-(2014/02/03(Mon) 17:34:22)
2014/02/03(Mon) 17:36:54 編集(投稿者)

No69849 (ひよこ さん) に返信
> SJISの
一口に SJIS と言っても、実はいろいろな実装があるという罠。
http://una.soragoto.net/topics/13.html
http://d.hatena.ne.jp/akumakario/20080522/1211452983
http://www.wdic.org/w/WDIC/%E3%82%B7%E3%83%95%E3%83%88JIS
http://www5d.biglobe.ne.jp/~noocyte/Programming/CharCode.html#SJIS
http://ja.wikipedia.org/wiki/MacJapanese


> 機種依存文字
それぞれの文字によって、「機種依存文字」と呼ばれる理由は様々ですが、
目的は何でしょうか? どの程度までの調査が必要でしょうか。

ご存知のように、JavaScript は文字列を Unicode ベースで処理するように
なっているため、調査できる範囲には限界があります。


具体例を挙げてみると、たとえば Windows 実装のシフトJIS(CP932) においては、
「平方根記号」が 0x8795 と 0x81e3 の2箇所に配置されています。

ひよこさんの案に従うとすれば、
> 半角カナ文字エリア 00A0〜00FF 、特殊文字エリア 8540〜889E 、縦文字エリア EB40〜EFFC 、外字エリア F040〜
ですから、前者(NEC文字)は機種依存文字ですが、後者はそうでは無いですよね。


さて、これらが Unicode に変換される際には、Windows の実装においては
 http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT
のように変換されます。抜粋してみると、
 0x8795 0x221A #SQUARE ROOT
 0x81E3 0x221A #SQUARE ROOT
となっていますね。すなわち、どちらの文字も Unicode では U+221A となるわけです。

ゆえに charCodeAt や正規表現では、U+221A がどちらの文字だったのかを判断できません。
(もっとも、15年前ならいざ知らず、今更 0x8795 が入力される可能性は低そうですが)


ちなみに Mac のシフトJIS実装(MacJapanese)においては、
 http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/JAPANESE.TXT
に書かれているように、同じバイナリでも、違う文字にマッピングされています。
 0x8795 0x32A6 # CIRCLED IDEOGRAPH LOW
 0x81E3 0x221A # SQUARE ROOT
0x8795 は平方根記号ではなく、丸囲みの「下」を意味します。
0x8795 が機種依存文字とされるゆえんですね。


さて、ユーザーにメール文章などを入力してもらうような場合は、
0x8795 の平方根が 0x81e3 の平方根に置き換わってしまっても、
文章的には支障が無いため、両者を U+221A に同一視する処理系では
そもそも検出する必要が無く、charAt や 正規表現でも十分といえます。

(Windows の実装では、U+221A を逆変換した場合、常に 0x81e3 になります)
http://support.microsoft.com/kb/170559/ja



問題は、テキストとしてではなく、バイナリレベルでの完全一致が必要な場合ですね。

たとえば XMLHttpRequest による Web スクレイピングなどにおいては、
データを文字列として処理するのではなく、.responseType = "arraybuffer" として
バイナリのまま取り扱うといった手法が使われることがあります。


いずれにせよ、実際に作りたいアプリで、どこまでの精度の判定が必要なのか、
どの文字を判定するべきなのかは、上記変換表などを元に検討してみてください。


> 半角カナ文字エリア 00A0〜00FF 、
ちなみに Windows 実装の Shift_JIS では
0x00 の文字はありますが(NUL)、0xA0 や 0x00A0 は存在しません。
0xFF や 0x00FF も無かったような…。
引用返信 編集キー/
■69866 / inTopicNo.3)  Re[1]: SJIS機種依存文字をunicode変換したい。
□投稿者/ 魔界の仮面弁士 (522回)-(2014/02/03(Mon) 18:29:28)
No69849 (ひよこ さん) に返信

関連情報として:

過去ログ No59396 [JavaScriptで機種依存文字を判定したい]
http://bbs.wankuma.com/index.cgi?mode=al2&namber=59396&KLOG=99

過去ログ No2021 [半角カタカナかどうか判別したい]
http://bbs.wankuma.com/index.cgi?mode=al2&namber=2021&KLOG=2
過去ログになると、「\」が「\」に化けるので読みにくいですが…。

力技で個別置換なパターン。
http://www.drk7.jp/MT/archives/001521.html
引用返信 編集キー/
■69872 / inTopicNo.4)  Re[2]: SJIS機種依存文字をunicode変換したい。
□投稿者/ ひよこ (2回)-(2014/02/04(Tue) 00:31:53)
No69866 (魔界の仮面弁士 さん) に返信
> ■No69849 (ひよこ さん) に返信
>
> 関連情報として:
>
> 過去ログ No59396 [JavaScriptで機種依存文字を判定したい]
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=59396&KLOG=99
>
> 過去ログ No2021 [半角カタカナかどうか判別したい]
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=2021&KLOG=2
> 過去ログになると、「\」が「\」に化けるので読みにくいですが…。
>
> 力技で個別置換なパターン。
> http://www.drk7.jp/MT/archives/001521.html

どうもありがとうございます。
SJISと一言に言ってもWindowsはもとより、Macもあれば、Unixでも使われているのですね・・・
まったく知りませんでした。。。大変参考になりました。ありがとうございます!
作成したいアプリは、個人的な趣味ですので、精度はあまり求めていません^^;
しかもWindows限定のアプリです。

さて、実装なのですが、
http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT

張ってくださりましたURLを参考にして、sjis(CP932)<->unicodeの変換テーブルを作成致しました。
入力された文字をcharCodeAtにかけて、返却されたunicodeコードで変換テーブルからsjis(CP932)コードを引いてきて、
レス1のフィルターにかける仕様にしました。

またよろしくお願いいたします。
解決致しましたので、チェックをつけさせて頂きます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -