アプリ版:「スタンプのみでお礼する」機能のリリースについて

掲題の通り、メジャーな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とマジコメを記述しなければならないのでしょうか?
ご教授ください。

A 回答 (1件)

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



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

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


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

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