【復活求む!】惜しくも解散してしまったバンド|J-ROCK編 >>

文字列の明確な違いがわかりません。

たとえば16進数のアスキー文字であれば

print "\x41";
とした場合 
A
という文字が出力されます。
また
print 0x41;
とした場合はアスキー文字ではなく
65という10進数における数値が出力されますね。
さらには
print "\xe6\x96\x87\xe5\xad\x97\xe5\x88\x97";
と記述すると
文字列 という文字が出力されます。

ではそうではなくユニコード文字列というのはなんなのでしょうか?

一般てきに \u0000
という形式で表記される物ですが、コレがいまいちわかりません。
これは16進数のアスキー文字によるマルチバイト文字の再現と何がことなるのでしょうか?
たとえば、JSONなんかを単純に出力してみるとこのユニコード文字列という形式で表現されますよね?

このユニコード文字列の実態?を知りたいです。
よろしく御願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

サクッと本題へ


一つ目の質問
A,出来ます
色々とやり方があります
コードを文字に変換し用意されている関数を使うこと
変換した後でコード化すれば任意のコードになるかと
・mb_convert_encoding('文字列','変換後コード','変換前コード')
・PDF_utf16_to_utf8 — 文字列を UTF-16 から UTF-8 に変換する
・PDF_utf32_to_utf16 — 文字列を UTF-32 から UTF-16 に変換する
・PDF_utf8_to_utf16 — 文字列を UTF-8 から UTF-16 に変換する
http://codezine.jp/article/detail/2668

二つ目の質問
A.はい、そうです
基本的にUnicodeと言えばUTF-16のLEなんですけれど
UTF32はマルチバイト文字列圏内では表現出来る文字が増えて嬉しい限りでしょうが
逆にマルチバイト文字列圏外では余計な情報なんですよね……
本当はUTF-8でも良いくらい、でもそれじゃマルチバイト圏内の人を蔑ろに……
なら、間を取って16にしようや……ってのが現在
なのでWindowsでUnicodeと言って使われているのは全国共通でUTF-16LE

先のURL先でffffと入れてみたら分かると思いますが1000のFなんですよね
……桁数が溢れてるんですよ、基本的にマルチバイトを使いたくなければ必要のない情報です
使いたければUTF-32にすればいいし、使いたくなければUTF-16にすればいいし
ただし、UNIX環境とかで使ってるコードは英語のみだぜ!って事ならUTF-8を使ったほうがいいです
英語圏のコードとかも入れやすいし……
    • good
    • 0

全てのコンピュータ上で統一された規格がユニコードになります


UTF-8やUTF-16の数字の部分は区切るビット幅
文字を8ビットごとに表しますよ、16ビットごとに表しますよってこと

\u 00 00
ユニコードの0000
これは制御文字列のユニコードなのですが例えが悪いです
全て0なので区切りが……
例が16進数なので16進数で説明すると
\u(ユニコード接頭) 000(レコード) 0(フィールド)
だったかな?

エクセルを思い浮かべてください
あのセル一つ一つに文字が入っていて
「\u010A」と表記することで決められている場所に入っている文字を読み取りに行ってる感じです
そしてコードごとに入っている文字を決めたのは
ゼロックス社を始めとするユニコードコンソーシアムと言う団体

リンク先も是非一読してみてください(特に二番目)
Hexに4桁の16進数を入れれば意味がわかるはずです
http://ja.wikipedia.org/wiki/Unicode
http://code.cside.com/3rdpage/jp/?charset=utf-8& …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

UTF-8とUTF-16の違いは
ユニコード・・・・日本語でいうと文字集合(だいたいこの言葉で紹介されていますよね?)
の【コードポイント】文字の通し番号みたいなものを表現するための方式の違いという理解ですいいですかね?
UTF-8は日本語一文字がだいたい3バイトで表現されるという説明が大半かとおもいます。

追加で申し訳ないですが二点質問致します。

一点目=>
本質問で、例に挙げた
【文字列】と言う文字をUTF-8の形式であらわすと
「"\xe6\x96\x87\xe5\xad\x97\xe5\x88\x97"」
という形になると描きましたが、日本語一文字が16進数形式の8ビット 三つ分で表現されていますね。

ただ、ユニコードの表現方式の一つというと例えば最初の文字列という文字の【文】という箇所をUTF-8とだと【\xe6\x96\x87】
となりますが、これはなにかしらの方法で、本来の【文】という文字を表現するユニコード(文字集合)のコードポイントである \u○○○○の形式に変換すること(言い方を返ると戻すこと?)もできるということでしょうか?
回答いただいたURLでしらべてみると6587番目が【文】という文字が格納されていますね。
つまり 【\xe6\x96\x87】を【\u6587】へとPHP上で変換できるのかどうか?

二点目=>
たいしてUTF-16というのは英語・日本語等のマルチバイトな文字問わず一文字16ビットで表現するエンコード方式という解釈でいいでしょうか?
すべての文字が\u0000 ~ \uFFFFの範囲で表現されるということですよね?
ただこの場合、もちろん2の16乗分・・・・・つまり65536文字分しか文字集合としてまとめることができず
結果、マルチバイト圏から不満の声がでたと各サイト等でありました。

そこでさらにもともとのユニコードから拡張したUTF-32が発案されて \u○○○○○○の六桁まで表現できるという感じですかね?
つまり【\uFFFF】番目以降の文字を表現するためにはUTF-32でエンコードすることが必要ということなのでしょうか?

お礼日時:2012/07/11 00:40

このQ&Aに関連する人気のQ&A

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

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

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

QUTF-8とASCIIコードにおける互換性について

UTF-8とASCIIはそのASCIIコードの範囲のおいて
互換性を持ちます。(と、書籍や多種な文献にはそういった記述があります)

たとえば【A】という文字をUTF-8で符号化した際は【41】(16進数で)
さらにASCIIコードでも【41】という値がAという文字に割り当てられています。
確かに、一件互換しているようにみえますが、UTF-8っていうことは最終的には
Unicode上のコードポイントの値・・・つまり0x0041という値に復元?(というのでしょうか)するわけですよね?
でそのUnicodeの文字集合上から復元したコードポイントに対応する文字を参照しAという文字をみつけてくると・・・。
これって【A】という文字をUTF-8で符号化した歳のバイト列はASCIIと一致しているけれど
結局Unicodeコードポイントに直した場合【00】という上位バイトが無駄にくっついてきて【0x0041】となり
互換性がなくなるのではとおもったのですが・・・。

これはどういう意味の互換性なのでしょうか?
識者の方ご教授ください。
お願い致します。

Aベストアンサー

No1,3,6です。

>とあった時、おそらくどの言語でもそうだと思うのですが、スクリプトファイル内の特定の文字列はそれぞれ個別にエンコーディング情報を持つと思います。(※言語によっては持たいない?)

持たないのが普通です。
文字列個別にエンコード情報を持つのは、メジャーな言語だとRubyくらい?
他の言語では、プログラム中では1つのプログラム中では一種類のエンコードしか扱えません。もしくは、言語は全くエンコードを関知せず、すべてプログラマが管理するか。

最初の疑問に戻って、
「UTF-8とASCIIはそのASCIIコードの範囲において互換性を持ちます。」
というのは、
「ASCIIコードの範囲の文字を、ASCIIでエンコードしても、UTF-8でエンコードしても、全く同じ値になる」という意味であり、それ以上でも以下でも無いです。
別の言い方をすると、ASCIIコードの範囲の文字しか含まれないファイルであれば、そのファイルのエンコードがASCIIだとかUTF-8だとか、さらに(バックすらスラッシュ等)一部の記号を除けばSHIFT_JISだとかeuc-jpだとかいうのも区別できないというか同じです。

No1,3,6です。

>とあった時、おそらくどの言語でもそうだと思うのですが、スクリプトファイル内の特定の文字列はそれぞれ個別にエンコーディング情報を持つと思います。(※言語によっては持たいない?)

持たないのが普通です。
文字列個別にエンコード情報を持つのは、メジャーな言語だとRubyくらい?
他の言語では、プログラム中では1つのプログラム中では一種類のエンコードしか扱えません。もしくは、言語は全くエンコードを関知せず、すべてプログラマが管理するか。

最初の疑問に戻って、
「UTF-8とASC...続きを読む

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

Q16進数の文字列を普通の文字列に直す方法

色々と探し尽くしたのですが、

&#x5B89;&#x5BA4;&#x5948;&#x7F8E;&#x6075

のような文字列を

安室奈美恵

という普通の文字列に直す方法が解りません。

chr pack

とかが引っかかりましたが、
どうやら設定が必要なようでお手上げです。

どなたかご教授よろしくお願い致します

Aベストアンサー

ANo.2です。

>パラメータとかあるのでしょうか?
マニュアルに書いてあります。

3つ目の引数(パラメータ)に適切な文字セットを指定する必要があるのでしょう。

Qidを使わずにonclickで自身の要素取得

javascriptで
<a href="XXX.XXX" title="ゴール" onclick="element()">test</a>
function() {
idを使わずにここにtitle属性のゴールを習得する方法を記述したいのですが、わかりません
よろしくお願いします
}

Aベストアンサー

こんにちは。


==== HTML
<a href="" title="ゴール" onclick="getTitle(this);return false;">test</a>
<a href="" title="スタート" onclick="getTitle(this);return false;">test2</a>


==== JavaScript
function getTitle ( obj ) {
var title = obj.getAttribute('title');
alert ( title );
}

こういうことでしょうか。
違っていたらすみません。

Qで配列(複数の要素)を渡したいとき?

こんにちわ,

今HTML+PHPで
$hoge[]にいくつかの要素が入っているとき,
それをあるfoo.phpというページに渡したいとき,
echo '<form action="foo.php" method="POST">';
echo '<input type="hidden" name="$hoge[]" >';
echo '</form>';
としたのですが,うまくいきません。

どうしたらよろしいでしょうか。

Aベストアンサー

nameじゃなく、valueでは?
あとやるなら、
for($i=0;$i<count($hoge);$i++){
print "<input type=\"hidden\" name=\"$hoge[$i][0]\" value=\"$hoge[$i][1]\">";
}
とか?

QERROR1062:Duplicate entry.....というエラーが出てしまいました

いつもお世話になります。
データベースからSELECTで抽出したデータを別のテーブルにINSERTするSQLを実行したのですが、
ERROR1062:Duplicate entry.....というエラーが出てしまいました。
お詳しい方がいらっしゃいましたら、アドバイスをいただけませんでしょうか?よろしくお願いいたします。
【実行したSQL】
INSERT INTO tblA (dataA1, dataA2, dataA3, dataA4) SELECT "9001","AA",dataB1,dataB2 FROM tblB WHERE dataB1 = 52

tblAの主キー:dataA1とdataA2
tblBの主キー:dataB1

dataA1とdataA2はtblAの主キーとなっているため、重複してしまうということのようです。tblBの主キーはdataB1であるため、抽出されてくるデータは常に1件なので問題ないと期待していましたが、甘くなかったようです。何か良い方法はないものでしょうか?よろしくお願いいたします。

Aベストアンサー

「ERROR 1062」は、重複データを格納しようとした場合に出力されるエラーです。
既にdataA1='9001'&dataA2='AA'という行が、tblAに格納されているのですよね?

>抽出されてくるデータは常に1件なので問題ないと期待していました

「insert ~ select ~」を実行前に、既に同じデータが格納されているのでは?
あるいはprimary keyの指定が、質問中に記された通りでなく、2件以上検索されているかです。

>何か良い方法はないものでしょうか?

何をするための方法を、聞きたいのかが分かりませんが?

Q未、済、完了の英訳は?

前回類似件名で質問したのですが、
質問の仕方があまり良くなかったと思い質問し直させて頂きます。

ある項目に対して「未」、「済」、「完了」のいずれかを選択させたい帳票があるのですが、
これを英語で実現するにはどのような単語が当てはまるのでしょうか?(1,2語程度で)
「済」、「完了」については「done」が好ましいのかなと思っていますが
いかがでしょうか?

宜しくお願い致します。

Aベストアンサー

No. 2 です。

なるほど。。。
そういうことなのでしたら、“Done” と “Not Yet” が適切だと思います。

“Yet” は単独で用いられる場合、『まだ~ない』という意味に取られることはなく、接続詞の『でも』の意味で取られます。
なので、選択肢が “Done” と “Yet” であったとしても、理解してもらえない可能性が残ります。
それを排除するためには、“Not Yet” とするべきだと思います。

ご参考まで。^^

QMySQLで改行を含む文の登録のしかた(改行コード

MySQLで改行を含む文を登録したいんですが、改行を改行コードに書き換えて登録したいです。
改行コードはどのように書けばいいですか?

登録したい文:
あいうえお
かきくけこ
さしすせそ

Aベストアンサー

改行コードは¥nで登録すれば良いです。

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

QJavaScriptde途中で、「exit」するには?

function kensaku(){
s_data = document.kaiin_form.input_name.value;

if(!s_data){ alert("キーワードを入れて下さい!"); }

if(s_data != dumy){ ...... }
for(i=st_no;i<=n;i++){
......省略.................;
.......省略................}
}

----------------------------------
3行目で表示されたアラートをOKで閉じても、4行目以下が実行されてしまいます。
3行目でexitするにはどうすれば良いでしょうか?

Aベストアンサー

>関数(kensaku())からは抜けられませんでした。
そうですね、勘違いしていました、f(^^;
すみません。
if(!s_data){
alert("キーワードを入れて下さい!");
return;
}
ですね。


人気Q&Aランキング