Home > 文字コード Archive

文字コード Archive

CP932 と Shift_JIS について / 文字コード

CP932

Windowsにおける文字コード。一般的には「shift_jis」だが、正しくは「CP932」である。
MS932とも言う)

CP932はshift_jisを拡張したもの。
(基本的には文字コードとしての違いはない)

が、他の文字コードへ変換する場合に違いが出る。
(一部の文字が異なる整数値へと変換される > 文字化けの原因となる)

例:〜 をshift_jisとしてUnicode変換すると 0×301C 、CP932としてUnicode変換すると 0xFF5E (Eclipse上でたまに遭遇してたのはこれだった)

また、一部の文字はCP932には存在するがshift_jisには存在しない。

IANAでの登録名は「Windows-31J」。

ということで、プログラム内とかではshift_jisじゃなくてCP932(MS932)を使ったほうがいいらしい。

>> CP932とは

モバイルサイト制作における文字コードの扱いについて

参照記事:携帯サイトの文字コードに気をつける

Shift_JIS

基本的に日本でモバイルサイトを制作する際には、文字コードはShift_JISを利用する。

出力文字コードはSJIS-win

モバイルサイトで絵文字を扱うには、各キャリアの絵文字が設定されている「外字領域」を含んだ文字エンコードを利用する必要がある。

PHPの場合では、それは「SJIS-win」になる。SJIS-winはShift_JISに比べて扱える文字種が増えていて、キャリアごとの絵文字領域もカヴァーしている。そのため、PHPでモバイルサイトを作成する場合にはShift_JISではなく、SJIS-winを使用する。

内部文字コードはeucJP-win

内部文字コードにEUC-JPを利用している場合(ソースファイル、プログラムファイルをEUC-JPで作成している場合)は「eucJP-win」を利用する。(これも出力文字コード同様、絵文字領域をカヴァーするため)

* php.ini の「mbstring.internal_encoding」項目において、内部文字エンコードに「eucJP-win」を指定してやる。

UTF-8

UTF-8の場合は、これは絵文字領域もカヴァーしているらしいので、とくに意識する必要はないらしい。
(内部文字コードはUTF-8を指定して、ソースファイルの文字コードもUTF-8使って、んで出力の場面でのみ mb_internal_encoding を使って出力文字コードに SJIS-win してやればいいってこと?試してないけど)

例外(SoftBankの3GC型)

SoftBankの3GC型端末では、文字コードを SJIS-win ではなく、UTF-8 で出力しないと不具合が起こるらしい。なので、通常の携帯端末へは SJIS-win で出力、SoftBankの3GC型端末のみ UTF-8 で出力という出し分けを行う必要がある、らしい。

PEARのNet_UserAgent_Mobileを使った場合の処理例

<?php
// Net_UserAgent_Mobile
require_once('Net/UserAgent/Mobile.php');
 
// Net_UserAgent_Mobileをインスタンス化
$agent = Net_UserAgent_Mobile::singleton();
 
// 出力する文字コードを変換
// SoftBankの3GC型端末はUTF-8に、それ以外はSJIS-winに変換
if ($agent->isSoftBank() && $agent-> isType3GC()) {
mb_convert_variables(mb_internal_encoding(), 'UTF-8', $_POST);
mb_convert_variables(mb_internal_encoding(), 'UTF-8', $_GET);
} else {
mb_convert_variables(mb_internal_encoding(), 'SJIS-win', $_POST);
mb_convert_variables(mb_internal_encoding(), 'SJIS-win', $_GET);
}
?>

MySQLのDB文字コードを変更する

Ubuntu Server にインストールした
mysql データベースの文字コードを utf-8 に変更する。

デフォルトだと latin1 になっている。以下のように。

mysql> show variables like ‘char%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.00 sec)

mysql の設定ファイル my.cnf は
/etc/mysql/ にあるので、このファイルに以下のように記述を追加。
(utf-8などと、ハイフンを入れないように注意)

[client] のブロックに
default-character-set=utf8

[mysqld] のブロックに
default-character-set=utf8
skip-character-set-client-handshake
を追記。

[mysql.server]
user=mysql
default-character-set=utf8
を適当な場所に追加。

[mysqld_safe] のブロックに
default-character-set=utf8
を追記。

[mysql] のブロックに
default-character-set=utf8
を追記。

[mysqldump] のブロックに
default-character-set=utf8
を追記。

[mysqld] ブロックの
language = /usr/share/mysql/english
の english を japanese に変更。

設定ファイルの設定を有効にするために、MySQL を再起動させる。

MySQL の開始、再起動、停止

$ sudo /etc/init.d/mysql start
$ sudo /etc/init.d/mysql restart
$ sudo /etc/init.d/mysql stop

確認してみると

mysql> show variables like ‘char%’;
+————————–+—————————-+
| Variable_name | Value |
+————————–+—————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+————————–+—————————-+
8 rows in set (0.00 sec)

全部 utf-8 になった(・∀・)イイ

ちなみに、character_set_filesystem の部分は binary で問題ないらしい。
(ファイルシステムのための文字コードなので)

モバイルサイト制作における文字コードの扱い

モバイルサイト制作における文字コードの扱いについて
復習の上、簡単にまとめなおしたので、それをメモ。

参照URL: 携帯サイトの文字コードに気をつける

Shift_JIS

基本的に日本でモバイルサイトを制作する際には、文字コードはShift_JISを利用する。

出力文字コードは「SJIS-win」

モバイルサイトで絵文字を扱うには、各キャリアの絵文字が設定されている「外字領域」を含んだ文字エンコードを利用する必要がある。

PHPの場合では、それは「SJIS-win」になる。SJIS-winはShift_JISに比べて扱える文字種が増えていて、キャリアごとの絵文字領域もカヴァーしている。そのため、PHPでモバイルサイトを作成する場合にはShift_JISではなく、SJIS-winを使用する。

内部文字コードは「eucJP-win」

内部文字コードにEUC-JPを利用している場合(ソースファイル、プログラムファイルをEUC-JPで作成している場合)は「eucJP-win」を利用する。(これも出力文字コード同様、絵文字領域をカヴァーするため)

php.iniの「mbstring.internal_encoding」項目において、内部文字エンコードに「eucJP-win」を指定してやる。

UTF-8

UTF-8の場合は、これは絵文字領域もカヴァーしているらしいので、とくに意識する必要はないらしい。
(内部文字コードはUTF-8を指定して、ソースファイルの文字コードもUTF-8使って、んで出力の場面でのみ mb_internal_encoding を使って出力文字コードに SJIS-win してやればいいってこと?試してないけど)

例外(SoftBankの3GC型)

SoftBankの3GC型端末では、文字コードを SJIS-win ではなく、UTF-8 で出力しないと不具合が起こるらしい。なので、通常の携帯端末へは SJIS-win で出力、SoftBankの3GC型端末のみ UTF-8 で出力という出し分けを行う必要がある、らしい。

PEARのNet_UserAgent_Mobileを使った場合の処理例

<?php
 
// Net_UserAgent_Mobile
require_once('Net/UserAgent/Mobile.php');
 
// Net_UserAgent_Mobileをインスタンス化
$agent = Net_UserAgent_Mobile::singleton();
 
// 出力する文字コードを変換
// SoftBankの3GC型端末はUTF-8に、それ以外はSJIS-winに変換
if ($agent->isSoftBank() && $agent-> isType3GC()) {
    mb_convert_variables(mb_internal_encoding(), 'UTF-8', $_POST);
    mb_convert_variables(mb_internal_encoding(), 'UTF-8', $_GET);
} else {
    mb_convert_variables(mb_internal_encoding(), 'SJIS-win', $_POST);
    mb_convert_variables(mb_internal_encoding(), 'SJIS-win', $_GET);
}
 
?>

Home > 文字コード Archive

Archives

Return to page top