問題
マルチバイト形式の関数はありません。
考え
入力文字列を変換することはできません。フォーマットの長さを変更する必要があります。フォーマット%4s
とは、4 つの幅を意味します(文字ではありません- 脚注を参照してください)。しかし、PHP 形式の関数はバイト数をカウントします。したがって、フォーマットの長さを に追加する必要がありますbytes - widths
。
実装
から @nimmneun
function mb_sprintf($format, ...$args) {
$params = $args;
$callback = function ($length) use (&$params) {
$value = array_shift($params);
return $length[0] + strlen($value) - mb_strwidth($value);
};
$format = preg_replace_callback('/(?<=%|%-)\d+(?=s)/', $callback, $format);
return sprintf($format, ...$args);
}
もう1つのオプションを忘れないでくださいstr_pad($input, $length, $pad_char=' ', STR_PAD_RIGHT)
function mb_str_pad(...$args) {
$args[1] += strlen($args[0]) - mb_strwidth($args[0]);
return str_pad(...$args);
}
脚注
アジア文字は 3 バイト、幅 2、文字長 1 です。フォーマットが%4s
で、入力が 1 つのアジア文字の場合、3 つではなく 2 つのスペース (パディング) が必要です。