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

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

ただいまの
回答率

90.47%

  • Java

    14116questions

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

  • Eclipse

    1710questions

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

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

受付中

回答 6

投稿

  • 評価
  • クリップ 0
  • VIEW 485

Siyon

score 1

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

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

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

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

package question;

public class Unicode {

    public static void main(String[] args) {

        System.out.println('あ');        //あ

        System.out.println('\u3042');    //ユニコードあ

        char a = 12354;
        System.out.println(a);            //文字コードあ
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+8

大量の誤解があります。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

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

  1. 文字それぞれに特定のコードを割り振ったものの集合(文字集合)
  2. 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
となります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

文字コードとユニコードで数値が違うのに
なぜ同じ'あ'を表記できるのでしょうか?

0x3042 == 12354

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/25 14:50

    遅かったw

    キャンセル

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の変数に渡しても同じ'あ'を示す数値として解釈されます。なので、すべて同じ出力結果となるのです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

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

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

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

ASCIIISO-2022-JPEUC-JPShift_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をあに変換したいというケースはまずないと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

  • 解決済

    String型について(短いコードです)

    前提・実現したいこと String(参照型)について理解したい。 質問 以下のコードをコンパイル・実行すると 【UPDATED, ORIGINAL】となるのですが、

  • 受付中

    java 標準クラス

    java勉強中ですがうまく動作しません。 ------dokojavaで動作しましたが、3回づつ表示されます。 public class Main { public st

  • 解決済

    Java エラー 初心者

    public class part01 { public static void main( String[] args ) { String name =

  • 解決済

    入力した値を表示させない方法

    初めまして。現在JAVAを学んでいる初心者です。 現在、配列に格納している値を表示させるプログラムを作っています。 ユーザーから入力があった場合、次に配列の値を表示させるとき、

  • 解決済

    Javaのスレッドの対象インスタンスについて

    Javaのsynchronized修飾子の対象インスタンスについての質問です。 http://www.tohoho-web.com/java/thread.htm こちらの記事

  • 解決済

    java 例外処理について

    前提・実現したいこと javaの例外処理についての問題を解いています。 ソースコード内で例外が起こっている場所とどういう例外が起きているのかをコメントで記述し、例外発生時には、

  • 解決済

    偶数だけ出したい

    public class Main { public static void main(String[] args) throws Exception { for (int

  • 解決済

    javaの配列に文字を格納して処理する方法

     疑問、質問 javaについての質問です。 キーボードから文字を一字ずつ入力し配列に格納する。 その後配列に格納されていた文字によってそれぞれ順番に処理していくというプログラ

同じタグがついた質問を見る

  • Java

    14116questions

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

  • Eclipse

    1710questions

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