- ベストアンサー
文字コードについての質問
- 文字コードの変化により表示できる言語の種類が増えましたが、その理由や文字化けの原因について詳しく知りたいです。
- 日本語以外の言語のコピー&ペーストの可否やUTF-8のバージョン差、国籍差について知りたいです。
- 日本語のXPでの文字化けや純正のOSの国籍による文字化けに関係するプログラムについて教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
既に回答にもありますが、 UTF8は可変長で1文字あたり1バイト~6バイト となります。 またUTF16も可変長で2バイトと4バイト文字があり、後者の文字をサロゲートペアといいます。 このうちサロゲートペアを使わないものがUCS2になります。 詳細はwikipediaをご参照ください。 http://ja.wikipedia.org/wiki/Unicode ■質問1 昔はSJISとEUCが混在しており、同じ日本語であっても、文字化けをするページが多かったです。 またSJISは日本語の為のコード体系であり、 例えば中国語の場合は「GBコード」や「BIG5コード」とよばれるコードが別途存在し、 これらはSJISの日本語部分とコードがコンフリクトし共存が出来ません。 UTF8で統一することで、それらの問題は解消されました。 また昨今ではページの先頭で文字コードを指定しているページがほとんどです。 <meta http-equiv="content-type" content="text/html; charset=utf-8"> のように。 ところで中国語の場合、65536通りでは収まりません。 全ての文字を表現する為にはサロゲートペアが必要になります。サロゲートペアの文字はUTF8では1文字4バイト以上になります。 (ただしサロゲートペアの文字はマイナーな文字が多いため、 ほとんどの場合サロゲートペア無しでも中国語は表現できると、知人の中国人から聞いています。) ■質問2 Windows2000以降のカーネルは基本的にUTF16で文字列を扱っています。 表示されるかしないかはOSが持っているフォントセットと アプリケーションがUnicode対応かどうかに依存します。 ちなみにOfficeXp以降をフルインストールすると 「Arial Unicode MS 」というフォントがインストールされ、ほぼ全ての文字が表示可能になります。 昔はUnicodeフォントセットをMSのホームページでダウンロードできたのですが今は出来ないようです。 Vista以降ではかなりの文字が表示できるようになったようです。 // Vistaで化ける字,化けない字,サロゲートペア http://itpro.nikkeibp.co.jp/article/COLUMN/20061211/256519/ ■質問3 Unicodeに対応したアプリケーションで上記のように Unicode対応のフォントセットがインストールされていれば 基本的に化けずに表示されます。 ただしサロゲートペアを処理できるかどうかはアプリ次第です。 例えばXpのメモ帳の場合、サロゲートペアの文字はコピー&ペーストできるのですが バックスペースでその文字を削除する際、文字が半分削除されたような状態になります。(恐らく2文字として扱われる為) またアプリケーション側でフォントセットを指定していた場合(例:CreateFont→SelectObject等)でも 無い場合は自動でそのフォントセットを使ってくれるようです。 ■質問4 WindowsAPIは最後がWで終わるものとAではじまる2通りがあることはご存知でしょうか? 例えば::TextOutAと::TextOutWがあり、T UNICODEがdefineされているかどうかでTextOutがwingdi.h内部で以下のように切り替えられています。 #ifdef UNICODE #define TextOut TextOutW #else #define TextOut TextOutA #endif // !UNICODE 前者はconst char*(日本語の場合、SJIS)を引数にとり、後者はconst wchar_t*(UTF16)を引数にとります。 http://msdn.microsoft.com/ja-jp/library/cc428775.aspx ※LPCTSTRがそれにあたります。これもUNICODEがdefineされているかどうかで定義が変わります。
その他の回答 (3)
- rinkun
- ベストアンサー率44% (706/1571)
1. UTF-8は一文字1~6バイト(Unicode文字は4バイトまで)の可変長エンコードです。日本語の漢字は基本3バイト表現になります。 2. 日本語以外のエンコードがUTF-8とは限りませんので。 3. ヨーロッパ系だとISO8859-1(Latin-1)が標準のものなどあると思います。 4. 「プログラマのための文字コード技術入門」 http://www.amazon.co.jp/dp/477414164X ですかね。 文字コードの世界は奥が深いので、まじめに何でも対応しようとすると生涯が掛かります。深入りしない方が良いでしょう。
お礼
UTF-8って6バイト使う事もあるんですね。 >文字コードの世界は奥が深いので、まじめに何でも対応 >しようとすると生涯が掛かります。深入りしない方が良いでしょう。 恐ろしいですね; どうしたものか・・ ご回答、ありがとうございました。色々考えさせられます。
- kmee
- ベストアンサー率55% (1857/3366)
> 半角1はバイト 全角は2バイト これ自体が特定の文字コードについてのものです。全ての文字コードがそのルールを使っているわけではありません。 例: EUC-JPの「半角カタカナ」は2バイト UTF-16は「半角英数」も2バイト UTF-8の「日本語の全角文字」は3バイト (ちなみに、昨今のプロポーショナルフォントを考えたら、「半角」「全角」という言い方自体が不適切) 回答1) そのとおりです。 詳しくは、Unicodeについて解説してある本やサイトで。
お礼
半角という存在はもう危ういのですね。 配列で使う時に意識していただけに、何か恐ろしいような; ご回答ありがとうございました。
- nobuoka
- ベストアンサー率69% (23/33)
> 半角1はバイト 全角は2バイト OS毎の改行コード差 まず、文字には半角と全角という区別は基本的にないものだと思ってください。 歴史的経緯などから半角、全角という区別がされることがあますが、本来的にはいわゆる半角の "a" も全角の "a" も同一の文字だとみなされるべきものです。 また、1 文字を表すために使用するビット数は文字符号化方式によって様々です。 例えば Shift_JIS や EUC-JP といった符号化方式の場合は 「半角 1 バイト、全角 2 バイト」 というような考え方が通用しましたが、UTF-16 では 2 バイト (一部の文字は 4 バイト) で 1 文字を表します。 ■ 質問 1 に関して 文字化けの原因は、web ページの (HTML ファイルの) 本来の文字符号化方式とブラウザが認識した文字符号化方式が一致しないというものです。 つまり、web サーバーが Shift_JIS の HTML ファイルを送っているのに、ブラウザがそれを EUC-JP だと解釈した場合に文字化けが起こります。 なぜそのような不一致が起こるかというと、web ページ制作者がちゃんと文字符号化方式についての設定をしていないなど、web ページの制作者側に原因があります。 最近文字化けが少なくなっている理由はいろいろあると思いますが、 ・Web ページの制作者がちゃんと制作するようになってきた ・Web 制作者が誤っていてもブラウザがちゃんと認識するように改良された といったことがあげられると思います。 > 2バイトで表現できるのは65536通り弱だと思うのですが > なぜそんなに多くの国の言語を同時に表示できるのでしょうか? 同じ web ページに多数の国の言語が同時に表示できるようになったのは、Shift_JIS などの日本語用の文字集合を用いた符号化方式ではなく、UTF-8 などの Unicode を用いた符号化方式が用いられているからと言えるでしょう。 EUC-JP や Shift_JIS は JIS X 0208 で規定された日本語用の文字集合を用いるため、日本語以外の文字はほとんど含んでいません。 一方、Unicode は全世界の全ての文字を含む (ことを目指している) 文字集合であり、その符号化方式である UTF-8 や UTF-16 を用いると、同じページに多数の言語の文字を混在させることができます。 ■ 質問 2 に関して > また、UTF-8の中にもバージョン差や国籍差が有ったりするのでしょうか? UTF-8 は Unicode のための文字符号化方式で、UTF-8 そのもの (符号化方式そのもの) にはバージョンはないと思います。 しかし、Unicode にはバージョンがありますので、それに応じて UTF-8 にもバージョンがあると言えるかもしれません。 ■ オススメの参考文献 Web ページではなくて申し訳ないのですが、『プログラマのための文字コード技術入門』 (ISBN-13: 978-4774141640) という書籍が非常に良くまとまっていておすすめです。
お礼
Webサイトは製作者側にも問題が有ったのですね。 そのほか色々勉強になりました。 書籍の紹介もありがとうございます。 ご回答ありがとうございました。
お礼
まだしっかりは把握できませんが、 なんとなく概要は解ったような気がします。 文字の扱い方を変えるべきなのか否か、 何か不安になりますが・・ 何はともあれ、詳しいご回答ありがとうございました。