OCN光で最大124,800円おトク!

UTF-8の文字コードをUnicode(コードポイント)へ変換させたいのですが、参考URLの情報のように計算式を知りたいです

例えば下の「あ」は、16進では「E38182」、10進では「14909826」ですが、どちらかの値を利用してUnicodeのポイントコード「12354」を計算式を用いて求めたいです。

「あ」
Unicode = 12354
16進 = E38182
10進 = 14909826


参考
http://questionbox.jp.msn.com/qa500194.html

A 回答 (2件)

どこまでを「通常」と言っていいのでしょうか?


いわゆる四則演算で求めるのは
「割り算。小数以下切り捨て」
「割り算の余り」
が必要になります。

0xE3 ÷ 0x10 = 0xE 余り 0x03 → この余りが 図中の4bit yyyy に相当
→ これが15~12位に収まるので 0x03 * 2^12
0x81 ÷ 0x40 = 0x2 余り 0x01 → この余りが 図中の6bit yxxxxx に相当
→ これが11~6位に収まるので 0x02 * 2^6
0x82 ÷ 0x40 = 0x2 余り 0x02 → この余りが 図中の6bit xxxxxx に相当
→ これが5~0位に収まるので 0x01 * 2^0
全部合計したものが、Unicodeポイント


また、値によって場合分けが必要です。
バイト長が一定では無いからです。



参考URLにあるものは、Unicodeを10進で表記したか、16進で表記したかの違いなので、単純な式で書けるだけです。
    • good
    • 0
この回答へのお礼

3バイト文字はkmeeさんの計算式どおり出来ました。

1. 0xE3 ÷ 0x10 = 0xE 余り 0x03 * 2^12 ---> 12288

2. 0x81 ÷ 0x40 = 0x2 余り 0x01 * 2^6 ---> 64

3. 0x82 ÷ 0x40 = 0x2 余り 0x02 ---> 2

12288 + 64 + 2 = 12354

2バイト文字は、2.3.を求めることで出すことができました。
大変ありがとうございました。

お礼日時:2013/07/27 21:37

http://ja.wikipedia.org/wiki/UTF-8
E38182 ではなく、 E3,81,82と、1バイト目、2バイト目... と考えた方がいいと思う。
全部まとめて10進数にしても、結局8ビット毎に分けて計算する必要があるので無意味。

この回答への補足

>E38182 ではなく、 E3,81,82と、1バイト目、2バイト目... と考えた方がいいと思う。

はい。
その考え方で通常の足し算や掛け算の計算式でUnicodeのコードポイントを割り出すことはできますでしょうか?

補足日時:2013/07/27 19:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q加重平均と平均の違い

加重平均と平均の違いってなんですか?
値が同じになることが多いような気がするんですけど・・・
わかりやす~い例で教えてください。

Aベストアンサー

例えば,テストをやって,A組の平均点80点,B組70点,C組60点だったとします.
全体の平均は70点!・・・これが単純な平均ですね.
クラスごとの人数が全く同じなら問題ないし,
わずかに違う程度なら誤差も少ないです.

ところが,A組100人,B組50人,C組10人だったら?
これで「平均70点」と言われたら,A組の生徒は文句を言いますよね.
そこで,クラスごとに重みをつけ,
(80×100+70×50+60×10)÷(100+50+10)=75.6
とやって求めるのが「加重平均」です.

Qflush()とclose()について

Javaを独習Javaで独習しています。現在、入出力の所まできたのですが、Writerクラスのclose()とflush()の違いがわかりません。それぞれのメソッドの意味はわかるのですがそれらを使う目的がわかりません。flush()は「バッファ付けデータをそのストリームで表されている物理デバイスに書き込む」とあるのですが、サンプルには(バッファ付け文字ストリームの単元にも)flush()は一度も出てこずclose()のみで書き込みが行われています。探したのですが独習Javaのサンプルの中には結局flush()は一度も出てきませんでした。この二つの違いはなんなのでしょうか?初心者のためわかりにくい質問かとは思いますがよろしくお願いします。

Aベストアンサー

フラッシュすれば、ファイルやその他物理デバイスに強制的にバッファの内容が出力されるということは、理解されていると考えてよいですね?

で、なかなかストリームをクローズできない(またはしない)場合には、いつまで経ってもバッファの内容が物理デバイスに出力されないかも知れませんよね?でも、適当なタイミングで定期的にフラッシュすれば、その時点でバッファに溜まっている内容が物理デバイスに出力されます。

そのサンプルの場合は、書き出してすぐ?クローズしちゃうため、明示的なフラッシュは必要なかったんだと思いますが、

・フラッシュは、(ストリームを閉じずに)バッファの内容を強制的に物理デバイスに出力する。
・クローズは、(フラッシュされていなければフラッシュしてから)そのストリームを閉じる。

とまぁ、目的も内容も全然違うわけです。

QWindowsの標準文字コードについて

標準文字コードはシフトJISとされていますが、

例えば、windowsでメモ帳を使って文字を書いて、保存をした時。
保存する時の文字コードは自由に選択できますよね。

この時点だと、どこにシフトJISコードが使われているのかはサッパリ分かりません。

それで考えたのですが、

文章を保存する時では無く、

メモ帳に書いている時に使われている文字が、
シフトJISなのでしょうか?(その文字を16進数としてみた時にシフトJISの文字コードになっている)

つまり、
もともと、windows上でwebページのフォームに文字を入力するとか、
メモ帳で文章を書くと、
シフトJISとして書いている事になるのでしょうか?(シフトJISコードに対応した16進数で書いている)

それを、例えばメモ帳ならシフトJISコードを違うコードに変換して保存する機能が付いている
ブラウザには、その機能は無いから、フォームからはシフトJISコードとしてのデータしか遅れない。

そう考えると、
windows上では入力する全ての文字がシフトJISコードという事になり、
標準文字コードがシフトJISという言葉にも納得がいくのですが、

上記の理解で正解なのでしょうか?

よろしくお願いします。

標準文字コードはシフトJISとされていますが、

例えば、windowsでメモ帳を使って文字を書いて、保存をした時。
保存する時の文字コードは自由に選択できますよね。

この時点だと、どこにシフトJISコードが使われているのかはサッパリ分かりません。

それで考えたのですが、

文章を保存する時では無く、

メモ帳に書いている時に使われている文字が、
シフトJISなのでしょうか?(その文字を16進数としてみた時にシフトJISの文字コードになっている)

つまり、
もともと、windows上でwebペー...続きを読む

Aベストアンサー

>まず自分がEUC-JPで保存したファイルを、
>EUC-JPを保存できたエディタで開くと見れるのはどうしてでしょうか??

>EUC-JPのコード→unicode→シフトJIS(このままだと文字化け)

>エディタでEUC-JPのファイルを文字化けせずに見られるのは、
>エディタがEUC-JPをシフトJISのコードに戻しているのでしょうか?

基本的にはその通りです。EUCに対応したエディタは、読み込み時に自動的に、あるいは明示されることにより、EUCコードを変換します。
変換の流れはOSの機能をどこまで使うかによって
EUC-JPのコード→シフトJIS(→unicode OSが自動処理)
EUC-JPのコード→unicode(→シフトJIS) (OSの内部コードにアプリが変換)
の両パターンありえると思います。

>2つ目は、ブラウザで文字化けする時に、
>正しいエンコードを選ぶと正しく表示されるのは、
>指定された文字コードからシフトJISコードに変換して表示しているか>ら、正しく表示されるのでしょうか?

その通りです。例えばInternetExplorerにはその専用の変換ルーチンが用意されています。実際WEBページやテキスト文書をIEであけて、保存の際にコードを選択すると任意のコードに変換することができます。

>まず自分がEUC-JPで保存したファイルを、
>EUC-JPを保存できたエディタで開くと見れるのはどうしてでしょうか??

>EUC-JPのコード→unicode→シフトJIS(このままだと文字化け)

>エディタでEUC-JPのファイルを文字化けせずに見られるのは、
>エディタがEUC-JPをシフトJISのコードに戻しているのでしょうか?

基本的にはその通りです。EUCに対応したエディタは、読み込み時に自動的に、あるいは明示されることにより、EUCコードを変換します。
変換の流れはOSの機能をどこまで使うかによって
EUC-JPの...続きを読む

QUTF-8とUnicodeの互換性

Windowsで使用されているUnicodeはUTF-16と理解しているのですが、
UTF-16→UTF-8は変換できると思いますが、
UTF-8→UTF-16の変換は一意に変換されるものなのでしょうか?

UTF-16は2バイトなので65,535文字が上限になり、
一方UTF-8は1~6バイトで、実質データ部は最大4バイトなので
表現できる文字数が違うので「UTF-8→UTF-16」の完全変換は無理なのでは?と思っています。

ご存知の方すみませんがどうぞご教授ください。

Aベストアンサー

まず「1文字が2バイト(16ビット)幅固定」というのは、UTF-16ではなくUCS-2のことです。

UCS-2はコードエリア0000~FFFFの65536文字分のみを表現できる、ある意味Unicodeのサブセットです。
UTF-16とは、サロゲートペアという仕組みを導入することで、UCS-2との互換を保ったまま、000000~10FFFF(D800~DFFFはサロゲートペア用のため除外)の1112064文字分を表現できるようにしたもので、正確には16/32ビット幅のマルチバイト文字コードです。
今日、普通にUnicodeといえばUTF-16形式を指しますが、初期版ではUCS-2でした。

UTF-8は、確かに理論上は00000000~7FFFFFFFまで表現可能ですが、Unicodeで実際にコードエリアとして定義されているのは10FFFFまで(しかもその中身はスカスカで、エリアがこれ以上拡張される可能性はまずない)なので、UTF-8とUTF-16の一意相互変換は全く問題ないとお考え頂いて結構です。


人気Q&Aランキング