質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

6回答

1675閲覧

ユニコードと文字コードの違いがわからない

Siyon

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2018/04/25 05:40

Javaプログラマーを目指している初心者です。

ユニコードと文字コードの違いがわからなくて困っています。
下記はすべてコンソールで'あ'の表記になります。
文字コードとユニコードで数値が違うのに
なぜ同じ'あ'を表記できるのでしょうか?

授業ではユニコードは日本語や中国語などのあらゆる言語を統一化して
他国でも同じような表記ができ、文字化けが起きないようにしていると伺いました。
またユニコードは16進数と聞いたのですが
進数とユニコードの関係性もよくわかりません。

文字コードとは日本特有のコードと考えればいいのでしょうか。
また文字コード、ユニコードの表を覚える必要性はあるのでしょうか。

Java

1package question; 2 3public class Unicode { 4 5 public static void main(String[] args) { 6 7 System.out.println('あ'); //あ 8 9 System.out.println('\u3042'); //ユニコードあ 10 11 char a = 12354; 12 System.out.println(a); //文字コードあ 13 } 14 15} 16

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

大量の誤解があります。

  • まず、「ユニコード」と「文字コード」は別物ではありません。いくつもある文字コードのうちの1つがユニコードです。そして、Javaの内部では全てUnicodeで動いています。
  • \uxxxxの書き方は16進数によるものです。0x3042 == 12354なので、両者は同じ値を指定しています。

投稿2018/04/25 05:46

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちょっと混乱しますが、文字コードといった場合に、次の二つの意味がありえます。

  1. 文字それぞれに特定のコードを割り振ったものの集合(文字集合)
    1. を、実際に利用するにあたってコード表記方式(文字符号化方式)を定めたもの

通常 Unicode といった場合は 1. を指します。ですが 2. があるように、「同じ Unicode でも符号化が異なるいくつもの方式がある」のです。

このいくつもの方式として、

  • UTF-8 (1byte~4byteまでの可変長で1文字を表す)
  • UTF-16 (2byte で1文字を表す。ただし基本多言語面以外はサロゲートペアを使って4byteで表す)
  • UTF-32 (4byte で1文字を表す)

といったものがあります。実際に文字コードとして意識するのは、こちらの方です。
Linux や Mac の世界では、UTF-8 が一般的です(XML も UTF-8 であることが前提となっています)。ですが Windows においては UTF-16 のことを「Unicode」と表現するので、ここを押さえておかないと混乱します。

さらにいうと、UTF-16 と UTF-32 には、エンディアン(多バイトを表すストリームの場合に、どちらが上位バイトになるかを決める)が絡みます。古くからの慣習に従い、Big Endian と Little Endian になっていますが、特にプロトコルなどで強制しない場合は Big Endian であると仮定されます。(明示的にエンディアンを表すための Byte Order Mark もあります)
※Windows の「メモ帳」の「Unicode」はUTF-16LE、「Unicode big endian」はUTF-16BE です

「あ」は、
Unicode: U+3042
UTF-16: 0x3042 (Unicodeで U+0000~U+FFFF は、UTF-16 と同じコードになる)
UTF-16BE: 0x3042(UTF-16 は未指定なので Big Endian となります)
UTF-16LE:0x4230(Little Endian だと順番が逆になる)
UTF-8: 0xE38182
となります。

投稿2018/04/25 06:54

編集2018/04/25 07:45
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考記事を貼っておきますので、学習にお役立てください。

> 文字コードとは日本特有のコードと考えればいいのでしょうか。
「日本特有の文字コードがある」と言い換えた方が良さそうです。
EUC-JPやShift-JISというのを聞いたことがあると思います。

最初のWikipediaのリンクにもありますね。

日本語には JIS X 0208 というひとつの文字集合に対して ISO-2022-JP (JIS コード等と呼ばれることが多い)、EUC-JP、Shift_JIS など複数の符号化方式が存在する。

> また文字コード、ユニコードの表を覚える必要性はあるのでしょうか。
基本的には、「必要ない」と思います。
覚えておいても損はないとは思いますが、膨大な量がある表を覚える暇があればプログラミングをしっかり学んで、書いて技術力を高めるべき です。

不明点がでたときに調べればいいかな、くらいに私は思っています。

投稿2018/04/25 06:11

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

文字コードとユニコードで数値が違うのに

なぜ同じ'あ'を表記できるのでしょうか?

0x3042 == 12354

投稿2018/04/25 05:48

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

そもそもコンピュータは文字を画像のように扱っているわけではなく、文字に対応する数値として扱っているのです。
人間的に(もっと限定して日本人的に)考えるなら、
あ行を1、か行を2という具合に対応づけて十の位に、あ段を1、い段を2という具合に対応付けて一の位に使用して、「こ」を25とか、「は」を61などのように、ルールを決めて対応させれば文字を数値で表せます。昔のポケベルではこのようにして文字を入力して送っていたようですね。

これは人がわかりやすいように対応づけを行いましたが、コンピュータの場合はそんな必要はなく、文字と数値が1対1で対応してさえいれば同じように扱えるわけです。この、文字と数値の対応関係のことを文字コードといいます。

先述の通り、文字に数値が1対1で対応していればいいので、「A」という文字に1を対応づけるルールがあっても、41を対応付けるルールがあってもかまわないわけです。そんな感じで世界には様々な文字と数値の対応ルールが生まれました。Unicodeもその一つです。つまり、Unicodeとは文字コードという文字と数値の対応ルール表の1つの種類です。

Javaのchar型の実体は、文字に対応するUnicodeの数値です。
Unicodeにおいては'あ'という文字は16進法で3042に対応づける、と定められています。
なので、Javaのコード上においては、文字リテラルで'あ'と書いても、Unicodeエスケープを使って'\u3042'と書いても全く同じです。
他の方の回答にもある通り、16進法の3024は10進法で12354なので、この数値リテラルをcharの変数に渡しても同じ'あ'を示す数値として解釈されます。なので、すべて同じ出力結果となるのです。

投稿2018/04/29 18:07

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ユニコードと文字コードの違いがわからなくて困っています。

「文字コード」か「文字コード体系」かで変わりますが、
文字コード体系との比較なら同じものですよ。

もっと正確に言えば文字コード体系の規格は沢山あり、ユニコードは文字コードの実装の一つです。

ASCII, ISO-2022-JP, EUC-JP, Shift_JIS...とまぁ沢山あります。

ユニコード(Unicode)は全世界で一つの「文字コード体系」で全ての文字を書き表すというプロジェクトを指します。
プロジェクトの結果として作られた文字コード体系はUTF-7, UTF-8, UTF-16, UTF-32などがあります。

ユニコードは16進数と聞いたのですが

そのchar型に代入した12345という数値は、内部的に2進数に変換されます。
ですので結局はSystem.out.println('\u3042');と同じことを2行に分けているだけです。

ユニコード以前に全ての文字コードは16進数が基準です。
元々コンピュータの世界には0か1かしかありません。
なのでこの0か1かを大量に使う事で、様々なものを表現するという事を行いました。

詳しくは下記のサイトを見て下さい。

参考サイト: 【5分で覚えるIT基礎の基礎】コンピュータの仕組み---第2回 2進数の世界

詳細は割愛しますが、
1バイトで表現出来る数値の番地(表)に1つずつ文字を当てはめて出来たものが文字コード体系です。

文字コードとは日本特有のコードと考えればいいのでしょうか。

いいえ違います。
質問文のコードには出てきていませんが、何かしらの文字モード体系で行きましょうという取り決めがなされています。
Javaが取り扱う文字コード体系はUTF-16のようですね。

アルファベットや数値、日本語問わず出力される全ての文字が文字コード体系の表により変換されて表示されます。

また文字コード、ユニコードの表を覚える必要性はあるのでしょうか。

ありません。
貴方は12345という数値を使って「あ」を出力するシステムを構築するエンジニアになりたいのですか?
そんなニッチな仕組み何処で使うねん!

ただ、完全に無いという訳ではありません。
文字コード体系を作るエンジニア、文字コード体系から各種OSやプログラミング言語用のライブラリを作るエンジニアが存在するからです。
そういった人間の場合、ある程度の文字ならどの番地にあるかくらいは知っておかないと話になりません。

教養として知っておくと得なケースがありますので、覚えておく事に損はありません。
しかし、有名な文字コード体系というのは、基本的にはどのパソコンやソフトにもライブラリという形で既に提供されています。
普段エンジニアが12345をあに変換したいというケースはまずないと思います。

投稿2018/04/25 06:14

編集2018/04/25 07:40
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問