PHP

PHP: SJIS全角文字の後半1バイトだけを無理に変換しようとすると、次の文字を巻き込んでしまう仕様のようだ

<?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
);

所感