26

sprintf のような継ぎ目は、外国語の文字に問題がありますか? それとも私が何か間違ったことをしているのですか?ただし、文字列から åäö のような文字を削除すると機能するようです。それは必要でしょうか?

レポート用に次の行を正しく配置する必要があります。

2011-11-27   A1823    -Ref. Leif  -           12 873,00    18.98
2011-11-30   A1856    -Rättat xx -            6 594,00    19.18

私は次のように sprintf() を使用しています: %-12s %-8s -%-10s -%20s %8.2f

使用: php-5.3.23-nts-Win32-VC9-x86

4

4 に答える 4

0

問題

マルチバイト形式の関数はありません。

考え

入力文字列を変換することはできません。フォーマットの長さを変更する必要があります。フォーマット%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 つのスペース (パディング) が必要です。

于 2021-04-17T15:00:14.567 に答える