SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【LPIC102】Linuxにおけるローカライゼーション LPICで学ぶLinux7

ローカライゼーション

まずは前提として、コンピュータにおけるローカライゼーションとはソフトウェアを開発した環境とは別の環境に適合させることです。
これは国際化や地域化と言われるものです。

情報処理における国際化と地域化(こくさいか と ちいきか)は、ソフトウェアを開発した環境とは異なる環境、特に外国や異文化に適合させる手段である。

引用元国際化と地域化 - Wikipedia

ロケール

ローカライゼーションに対応するための情報はロケール(地域情報)と言われます。
これを当該地域に合わせることによって、言語や通貨、表示仕様などを適用させます。

ロケールはカテゴリごとに環境変数で設定されていますが、全てのカテゴリをまとめてLANGまたはLC_ALLの環境変数に設定されている場合もあります。

私のCentOS7環境ではLANGにて設定されていました。
カテゴリはlocaleコマンドにより表示することができます。

・表示例

[wantan@localhost ~]$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

■ロケールの主要カテゴリ

カテゴリ 内容
LC_CTYPE 文字の種類、分類
LC_NUMERIC 数値の書式
LC_TIME 日付時間の書式
LC_COLLATE 文字の照合や整列
LC_MONETARY 通貨の書式
LC_MESSAGES 出力メッセージの言語
LC_NAME 名前の書式
LC_ADDRESS アドレスの書式
LC_TELEPHONE 電話番号の書式

また、ロケールには以下の設定ファイルもあります。
※重要度はいまいちわからない

/etc/locale.conf

文字コード

そもそもの文字コード

文字コード自体は、本気で学習しようとするとかなり深さがある内容ですが、ここではLPICの範囲に従い軽くさらいます。

そもそも文字コードとはビット列と文字を相互に変換する一連のルールのことを指します。

f:id:wantanBlog:20201203231448p:plain

この文字コードというルールは大きく2つの要素から成ります。
参照するものによって、微妙に表記ゆれがあるような気がしますが、ここでは「符号化文字集合(CCS)」と「文字符号化方式(CES)」とします。

・符号化文字集合
文字と一意に振られた番号のペアの集合。

・文字符号化方式
文字に振られた番号をバイト表現に変換する方法。

引用元:文字コード - Wikipedia

以下が私がもったイメージです。

f:id:wantanBlog:20201203235556p:plain

符号化文字集合に対して複数の文字符号化方式が適用できるケースがあります。
これがUnicodeに対するUTF-8UTF-16の関係です。

この辺はネットで検索しようとすると、サイトによって言葉の定義や説明にばらつきがあり混乱する可能性があります。
資格試験のために勉強するのであればその参考書や文字コード自体をしっかりと学習したい場合には専門書や有識者にきいてみるのが正確に理解するための近道な気がします。

何はともあれ、ここでは単に文字コードと言った場合には文字符号化方式の名称を使うことにします。

Unicode→文字コードではない
UTF-8,Shift-Jis→文字コードである

Linuxにおける文字コード

Linuxにおける(試験的に)主要な文字コードには以下のような種類があります。

文字コード 内容
ASCⅡ 7ビット表記128文字の文字コード。国際標準規格。
ISO-8859 ASCⅡの拡張版。256文字対応。
UTF-8 Unicodeを使用した文字コード。 ASCⅡの互換性をもつ。
EUC-JP 拡張UNIXと言われ、UNIX環境上で日本語、中国語などに対応。
Shift-JIS JISに定められた標準の日本語文字コード

最近のLinuxディストリビューションでは多くの場合、UTF-8が標準として設定されていることが多いようです。

■iconv コマンド
WindowsマシンとLinuxマシンでファイルを扱う場合、Windowsマシンでは多くの場合はShift-Jisが標準文字コードとなっているため、文字化けが発生する可能性があります。
このような場合に、iconvコマンドを使用することにより文字コードの変換を行うことができます。

iconvコマンドオプション

オプション 内容
-f 変換前の文字コードを指定
-t 返還後の文字コードを指定
-l 扱える文字コードを表示

fはfrom、tはtoを指すことを意識していれば比較的覚えやすいオプションかと思います。

・使用できる文字コードを表示

[wantan@localhost ~]$ iconv -l
以下のリストには、全ての既知の文字集合が含まれています。これらの名前は
コマンドラインパラメータの FROM と TO の全ての組み合わせとして使用出来
るとは限りません。ある文字集合は複数の異なった名前 (別名、alias) で
リストされています。
## 部分抜粋
  SEN_850200_B, SEN_850200_C, SHIFT-JIS, SHIFT_JIS, SHIFT_JISX0213, SJIS-OPEN,
  SJIS-WIN, SJIS, SS636127, STRK1048-2002, ST_SEV_358-88, T.61-8BIT, T.61,
  T.618BIT, TCVN-5712, TCVN, TCVN5712-1, TCVN5712-1:1993, THAI8, TIS-620,
  TIS620-0, TIS620.2529-1, TIS620.2533-0, TIS620, TS-5881, TSCII, TURKISH8,
  UCS-2, UCS-2BE, UCS-2LE, UCS-4, UCS-4BE, UCS-4LE, UCS2, UCS4, UHC, UJIS, UK,
  UNICODE, UNICODEBIG, UNICODELITTLE, US-ASCII, US, UTF-7, UTF-8, UTF-16,
  UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, UTF7, UTF8, UTF16, UTF16BE,
  UTF16LE, UTF32, UTF32BE, UTF32LE, VISCII, WCHAR_T, WIN-SAMI-2, WINBALTRIM,
  WINDOWS-31J, WINDOWS-874, WINDOWS-936, WINDOWS-1250, WINDOWS-1251,
## 省略

・ファイルの文字コードを変換する
今回の例では文字コードを「UTF-8→EUC-JP」に変換します。
ファイルの現在の文字コードはfileコマンドにより確認しました。

[wantan@localhost ~]$ file -i test111.txt
test111.txt: text/plain; charset=utf-8
[wantan@localhost ~]$ iconv -f UTF-8 -t EUC-JP test111.txt
test
テスト

上記の出力結果から分かるようにiconvコマンドの標準出力はディスプレイ表示されるので、ファイルとし変換(保存)する場合には、リダイレクトを指定する必要があります。

[wantan@localhost ~]$ iconv -f UTF-8 -t EUC-JP test111.txt > eucjpfile.txt
[wantan@localhost ~]$ file -i eucjpfile.txt
eucjpfile.txt: text/plain; charset=iso-8859-1

タイムゾーン

試験区分的にはローカライゼーションの分野に入るようですが、NTPを扱うときに改めてまとめた方がいいかなと思ったのでほんとにさらっと。

■タイムゾーン情報ファイル

タイムゾーンの情報ファイルは/usr/share/zoneinfo/配下にバイナリファイルとして格納されています。

[wantan@localhost ~]$ ls /usr/share/zoneinfo/
Africa      Canada   GB         Indian     Mexico    ROK        iso3166.tab
America     Chile    GB-Eire    Iran       NZ        Singapore  leapseconds
Antarctica  Cuba     GMT        Israel     NZ-CHAT   Turkey     posix
Arctic      EET      GMT+0      Jamaica    Navajo    UCT        posixrules
Asia        EST      GMT-0      Japan      PRC       US         right
Atlantic    EST5EDT  GMT0       Kwajalein  PST8PDT   UTC        tzdata.zi
Australia   Egypt    Greenwich  Libya      Pacific   Universal  zone.tab
Brazil      Eire     HST        MET        Poland    W-SU       zone1970.tab
CET         Etc      Hongkong   MST        Portugal  WET
CST6CDT     Europe   Iceland    MST7MDT    ROC       Zulu


■タイムゾーンの変更

まず現在のタイムゾーンについてはtimedatectlコマンドにより確認することができます。
timedatectlについては別途扱うのでここではタイムゾーンを確認するだけ。

・現在のタイムゾーンを確認

[wantan@localhost ~]$ timedatectl status
      Local time: 金 2020-12-04 03:13:30 JST
  Universal time: 木 2020-12-03 18:13:30 UTC
        RTC time: 木 2020-12-03 18:07:00
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

ここから、さきほどのバイナリファイルを「/etc/localtime」へコピーすることによりタイムゾーンの変更を行います。

・タイムゾーン変更例

[wantan@localhost ~]$ cp /usr/share/zoneinfo/America/ /etc/localtime

または、コピーではなくシンボリックリンクをはるでもよいようです。

私のCentOS7環境では、デフォルトがシンボリックリンクによりライムゾーンの設定がされていました。

[wantan@localhost ~]$ ll /etc/localtime
lrwxrwxrwx. 1 root root 32  73 09:00 /etc/localtime -> ../usr/share/zoneinfo/Asia/Tokyo

一時的に時刻を変更したい場合には環境変数に設定することで実現することもできます。

[root@localhost wantan]# export TZ=America
[root@localhost wantan]# date
2020123日 木曜日 18:22:53 America

ーーーーーーーーーーーーーーーーーーーーーーー

・前回(第六回)
www.wantanblog.com

・次回(第八回)
www.wantanblog.com