14

$str5文字に修正しようとしていますが、できませんでした。

$str = "nü";
echo str_pad($str, 5, "ü"); // give nüü

私はそれがユニコードの問題であることを知っていて、たくさん検索しましたが、運がありませんでした。私は次のようなことを試みました。

echo str_pad($str, 4 + mb_strlen($s), $s);
echo str_pad($str, 5 + mb_strlen($s), $s);

また、私はこれhttp://www.php.net/manual/de/function.str-pad.php#89754を試し、これを見ましたhttps://stackoverflow.com/a/11871948/362780

この問題に関する経験はありますか?

ありがとう。

4

7 に答える 7

6

以下のように、のマルチバイトバージョンが必要ですstr_pad()のソースコードにstr_pad()触発されています。

function mb_str_pad($input, $pad_length, $pad_string = ' ', $pad_type = STR_PAD_RIGHT, $encoding = 'UTF-8')
{
    $input_length = mb_strlen($input, $encoding);
    $pad_string_length = mb_strlen($pad_string, $encoding);

    if ($pad_length <= 0 || ($pad_length - $input_length) <= 0) {
        return $input;
    }

    $num_pad_chars = $pad_length - $input_length;

    switch ($pad_type) {
        case STR_PAD_RIGHT:
            $left_pad = 0;
            $right_pad = $num_pad_chars;
            break;

        case STR_PAD_LEFT:
            $left_pad = $num_pad_chars;
            $right_pad = 0;
            break;

        case STR_PAD_BOTH:
            $left_pad = floor($num_pad_chars / 2);
            $right_pad = $num_pad_chars - $left_pad;
            break;
    }

    $result = '';
    for ($i = 0; $i < $left_pad; ++$i) {
        $result .= mb_substr($pad_string, $i % $pad_string_length, 1, $encoding);
    }
    $result .= $input;
    for ($i = 0; $i < $right_pad; ++$i) {
        $result .= mb_substr($pad_string, $i % $pad_string_length, 1, $encoding);
    }

    return $result;
}


$str = "nü";
$pad = "ü";

echo mb_str_pad($str, 5, $pad);
于 2013-02-08T13:28:31.857 に答える
3

もっとphp.net(ここ:http://php.net/str_pad#111147)の内部を調べる必要があると思います。しかし、私はそれを少し変更しました。

注:前にこれを呼び出すことを忘れないでくださいmb_internal_encoding("utf-8");

mb_internal_encoding("utf-8");

function str_pad_unicode($str, $pad_len, $pad_str = ' ', $dir = STR_PAD_RIGHT) {
    $str_len = mb_strlen($str);
    $pad_str_len = mb_strlen($pad_str);
    if (!$str_len && ($dir == STR_PAD_RIGHT || $dir == STR_PAD_LEFT)) {
        $str_len = 1; // @debug
    }
    if (!$pad_len || !$pad_str_len || $pad_len <= $str_len) {
        return $str;
    }

    $result = null;
    if ($dir == STR_PAD_BOTH) {
        $length = ($pad_len - $str_len) / 2;
        $repeat = ceil($length / $pad_str_len);
        $result = mb_substr(str_repeat($pad_str, $repeat), 0, floor($length))
                . $str
                . mb_substr(str_repeat($pad_str, $repeat), 0, ceil($length));
    } else {
        $repeat = ceil($str_len - $pad_str_len + $pad_len);
        if ($dir == STR_PAD_RIGHT) {
            $result = $str . str_repeat($pad_str, $repeat);
            $result = mb_substr($result, 0, $pad_len);
        } else if ($dir == STR_PAD_LEFT) {
            $result = str_repeat($pad_str, $repeat);
            $result = mb_substr($result, 0, 
                        $pad_len - (($str_len - $pad_str_len) + $pad_str_len))
                    . $str;
        }
    }

    return $result;
}

$t = STR_PAD_LEFT;
$s = '...';
$as = 'AO';
$ms = 'ÄÖ';
echo "<pre>\n";
for ($i = 3; $i <= 1000; $i++) {
    $s1 = str_pad($s, $i, $as, $t); // can not inculde unicode char!!!
    $s2 = str_pad_unicode($s, $i, $ms, $t);
    $l1 = strlen($s1);
    $l2 = mb_strlen($s2);
    echo "len $l1: $s1 \n";
    echo "len $l2: $s2 \n";
    echo "\n";
    if ($l1 != $l2) die("Fail!");
}
echo "</pre>";

ここでテスト:http://codepad.viper-7.com/3jTEgt

于 2013-02-08T13:37:05.147 に答える
2

これを試してください(失敗したように見えるかもしれませんが、これにはエンコーディングチェックもあります):

<?php 
function mb_str_pad ($input, $pad_length, $pad_string, $pad_style, $encoding="UTF-8") { 
   return str_pad($input, strlen($input)-mb_strlen($input,$encoding)+$pad_length, $pad_string, $pad_style); 
} 
?>

ソース

于 2013-02-08T13:10:45.870 に答える
2

これへの私の貢献。

/**
 * Multibyte String Pad
 *
 * Functionally, the equivalent of the standard str_pad function, but is capable of successfully padding multibyte strings.
 *
 * @param string $input The string to be padded.
 * @param int $length The length of the resultant padded string.
 * @param string $padding The string to use as padding. Defaults to space.
 * @param int $padType The type of padding. Defaults to STR_PAD_RIGHT.
 * @param string $encoding The encoding to use, defaults to UTF-8.
 *
 * @return string A padded multibyte string.
 */
function mb_str_pad($input, $length, $padding = ' ', $padType = STR_PAD_RIGHT, $encoding = 'UTF-8')
{
    $result = $input;
    if (($paddingRequired = $length - mb_strlen($input, $encoding)) > 0) {
        switch ($padType) {
            case STR_PAD_LEFT:
                $result =
                    mb_substr(str_repeat($padding, $paddingRequired), 0, $paddingRequired, $encoding).
                    $input;
                break;
            case STR_PAD_RIGHT:
                $result =
                    $input.
                    mb_substr(str_repeat($padding, $paddingRequired), 0, $paddingRequired, $encoding);
                break;
            case STR_PAD_BOTH:
                $leftPaddingLength = floor($paddingRequired / 2);
                $rightPaddingLength = $paddingRequired - $leftPaddingLength;
                $result =
                    mb_substr(str_repeat($padding, $leftPaddingLength), 0, $leftPaddingLength, $encoding).
                    $input.
                    mb_substr(str_repeat($padding, $rightPaddingLength), 0, $rightPaddingLength, $encoding);
                break;
        }
    }

    return $result;
}

ユニットテスト方法

/**
 * @dataProvider provideDataForMbStrPad
 *
 * @param string $input
 * @param int $length
 * @param string $padding
 * @param int $padType
 * @param string $result
 */
public function testMbStrPad($input, $length, $padding, $padType, $result)
{
    $this->assertEquals($result, Strings::mbStrPad($input, $length, $padding, $padType));
}

上記の単体テストのデータプロバイダー

public function provideDataForMbStrPad()
  {
      return [
          ['Nhiều byte string đệm', 0, ' ', STR_PAD_BOTH, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 0, ' ', STR_PAD_LEFT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 0, ' ', STR_PAD_RIGHT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 0, '充', STR_PAD_BOTH, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 0, '充', STR_PAD_LEFT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 0, '充', STR_PAD_RIGHT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 0, '煻充', STR_PAD_BOTH, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 20, ' ', STR_PAD_BOTH, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 20, ' ', STR_PAD_LEFT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 20, ' ', STR_PAD_RIGHT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 20, '充', STR_PAD_BOTH, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 20, '充', STR_PAD_LEFT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 20, '充', STR_PAD_RIGHT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 20, '煻充', STR_PAD_BOTH, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 21, ' ', STR_PAD_BOTH, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 21, ' ', STR_PAD_LEFT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 21, ' ', STR_PAD_RIGHT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 21, '充', STR_PAD_BOTH, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 21, '充', STR_PAD_LEFT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 21, '充', STR_PAD_RIGHT, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 21, '煻充', STR_PAD_BOTH, 'Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 22, ' ', STR_PAD_BOTH, 'Nhiều byte string đệm '],
          ['Nhiều byte string đệm', 22, ' ', STR_PAD_LEFT, ' Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 22, ' ', STR_PAD_RIGHT, 'Nhiều byte string đệm '],
          ['Nhiều byte string đệm', 22, '充', STR_PAD_BOTH, 'Nhiều byte string đệm充'],
          ['Nhiều byte string đệm', 22, '充', STR_PAD_LEFT, '充Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 22, '充', STR_PAD_RIGHT, 'Nhiều byte string đệm充'],
          ['Nhiều byte string đệm', 22, '煻充', STR_PAD_BOTH, 'Nhiều byte string đệm煻'],
          ['Nhiều byte string đệm', 23, ' ', STR_PAD_BOTH, ' Nhiều byte string đệm '],
          ['Nhiều byte string đệm', 23, ' ', STR_PAD_LEFT, '  Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 23, ' ', STR_PAD_RIGHT, 'Nhiều byte string đệm  '],
          ['Nhiều byte string đệm', 23, '充', STR_PAD_BOTH, '充Nhiều byte string đệm充'],
          ['Nhiều byte string đệm', 23, '充', STR_PAD_LEFT, '充充Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 23, '充', STR_PAD_RIGHT, 'Nhiều byte string đệm充充'],
          ['Nhiều byte string đệm', 23, '煻充', STR_PAD_BOTH, '煻Nhiều byte string đệm煻'],
          ['Nhiều byte string đệm', 24, ' ', STR_PAD_BOTH, ' Nhiều byte string đệm  '],
          ['Nhiều byte string đệm', 24, ' ', STR_PAD_LEFT, '   Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 24, ' ', STR_PAD_RIGHT, 'Nhiều byte string đệm   '],
          ['Nhiều byte string đệm', 24, '充', STR_PAD_BOTH, '充Nhiều byte string đệm充充'],
          ['Nhiều byte string đệm', 24, '充', STR_PAD_LEFT, '充充充Nhiều byte string đệm'],
          ['Nhiều byte string đệm', 24, '充', STR_PAD_RIGHT, 'Nhiều byte string đệm充充充'],
          ['Nhiều byte string đệm', 24, '煻充', STR_PAD_BOTH, '煻Nhiều byte string đệm煻充'],
          ['Nhiều byte string đệm', 25, '煻充', STR_PAD_BOTH, '煻充Nhiều byte string đệm煻充'],
          ['Nhiều byte string đệm', 26, '煻充', STR_PAD_BOTH, '煻充Nhiều byte string đệm煻充煻'],
      ];
  }
于 2019-10-07T15:27:43.340 に答える
1

注意:これは、user2032610からの元の質問に対する正確な回答ではありません。ただし、文字列をUnicode文字で埋める必要はなく、スペースやドットなどで埋める必要がある場合は、状況に応じて役立ちます(解決策を探していて、簡単なものが見つからなかったため、ここに配置しました1つ。同様の状況で他の人を助けるかもしれません。)

  1. mb_strlen()を使用して、実際の文字列の長さを計算するだけです。
  2. 次に、$ strの後にstr_padパターン(この場合はドット)をエコーし​​ます。
$str = "nü";
echo "nü" . str_pad('', 5 - mb_strlen($str), ".");

結果:nü..。

于 2021-03-12T13:34:14.980 に答える
1

を使用することもできますstr_repeat

function mb_str_pad($string, $length, $pad_string = " ")
{
    return $string . str_repeat($pad_string, $length - mb_strlen($string));
}

STR_PAD_RIGHTSTR_PAD_LEFTまたはSTR_PAD_BOTH;を追加することで、この機能をアップグレードできます。

于 2021-05-26T16:16:44.880 に答える
0
function mb_str_pad($str,$pad,$pad_str,$pad_type = STR_PAD_RIGHT,$encoding = 'UTF-8'){
        $result = null;
        $length = mb_strlen($str,$encoding);
        if($length > $pad) $result = mb_substr($str,0,$pad,$encoding);
        else if($length == $pad) $result = $str; 
        else $result = $str.str_repeat($pad_str,$pad - $length);
        return $result;     
     } 
于 2019-05-20T10:29:10.830 に答える