<?php
function sjis(string $s) {
return mb_convert_encoding($s, 'SJIS-win', 'UTF-8');
}
function utf8(string $s) {
return mb_convert_encoding($s, 'UTF-8', 'SJIS-win');
}
function bytes(string $s) {
return strtr(urlencode($s), '%', 'x');
}
function strings(string $b) {
return urldecode(strtr($b, 'x', '%'));
}
function println(string ...$x) { foreach ($x as $y) echo $y, PHP_EOL; }
ini_set('mbstring.substitute_character', 'long');
println(
bytes(sjis("◎!")), // x81x9Dx21 (全角二重マルと半角の感嘆符)
utf8(strings('x9Dx21')) // BAD+9D21
);
所感
この仕様のため、CSVを読み取るプログラム(ストリーム処理でSJISからUTF-8に変換するやつ)で、ちょうどストリームチャンクの境界に全角文字が来てしまうと、文字化けするという現象が発生してしまっていた。 https://t.co/h4wwB1M5PY
— ❄️suin (@suin) 2018年8月7日