こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

各種スクリプト言語の記述時の文字コードについて

掲題の通り、メジャーなLL言語についての文字コードについて質問です。
例えば
PHPでコンソール用にちょっとしたものを書くとき

#! /usr/local/php

print("文字列");


書いて、ターミナルで
php ./sample.php
などとすると問題なく「文字列」という文字が表示されます。
このとき、ファイルはUTF-8で書いたとします。

次に、別のLL言語pythonで下記の様に記述したとします。
#! /usr/local/python

print ("python文字列");

上記内容を
python ./sample.py
などと実行すると
SyntaxError: Non-ASCII character '\xe6' in file
と上記のようなエラーがでます。どうやらアスキーコードの範囲外のバイト数が含まれているようです。
これを
#! /usr/local/python
#coding: utf-8
print ("python文字列");

としてやると問題なく「python 文字列」と表示されると思います。
これはRubyでも同じだと思います。
また同じ様に

#! /usr/bin/bash

echo "文字列"

とシェルスクリプトで上記の様にかいてやると・・・
問題なく「文字列」と表記されます。

ではなぜシェルスクリプト(bash)やPHPはマジックコメントを記述しなくても
暗黙のうちにUTF-8で文字列が表記されて
pythonやRubyは明示的にUTF-8とマジコメを記述しなければならないのでしょうか?
ご教授ください。

投稿日時 - 2014-05-12 23:29:23

QNo.8592830

すぐに回答ほしいです

質問者が選んだベストアンサー

文字コードについては、2つの考え方があります。

一つは、「文字列は一旦内部で共通のコードに変換して、外部に出力するときは、その出力先の文字コードに変換する」
もう一つは、「文字コード等考えずに、書かれたままのバイナリーデータを出力する」

シェルは基本的に後者です。
「文」「字」「列」という3文字だとは認識していません。
UTF-8なら「文の1バイト目」「文の2バイト目」「文の3バイト目」「字の1バイト目」... という 9文字だと認識しています。
この9バイトの列を「UTF-8だと解釈して表示する端末」を使うと「文字列」と読めます。
利点は「解釈しないのそのまま使える」こと
欠点は「日本語等の1文字を『1文字』として扱えない」こと、あるいは、「日本語等の1文字を扱うために、特別な方法が必要」ということです。


Pythonは前者です。
利点は「日本語等の1文字を『1文字』としてあつかえる」
欠点は「内部コードへの変換のために、元がどのコードなのか判断する必要がある」ということです。
自動判定、というのもないわけではないですが、誤判定してしまうという問題があります。
確実なのは、「書いた人に聞く」ことです。

投稿日時 - 2014-05-13 00:06:12

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-
-広告-
-広告-