gpt4 book ai didi

php - 特殊字符在 php 中丢弃 str_pad?

转载 作者:可可西里 更新时间:2023-10-31 22:43:18 28 4
gpt4 key购买 nike

我正在编写一个模块,应该能够以 BankOne 格式导出交易记录。

Here is the specification of the format

Here is an example file

字段放在一行的特定范围内,记录由新行分隔。需要添加大量空格以确保字段在行中的特定点开始和结束。

我为此在 php 中编写了一个函数。它将字段作为参数,并应返回格式正确的记录。

function record4($checknum='', $nameid='', $purpose='', $pledge='', $payment='', 
$frequency='', $title='', $fname='', $lname='', $suffix='',
$address='', $postalcode='', $city='', $state='', $greeting='')
{
$fields = array(
'checknum' => array('length' => 8, 'start' => 37),
'nameid' => array('length' => 7, 'start' => 45),
'purpose' => array('length' => 5, 'start' => 52),
'pledge' => array('length' => 10, 'start' => 57),
'payment' => array('length' => 10, 'start' => 67),
'frequency' => array('length' => 1, 'start' => 77),
'title' => array('length' => 20, 'start' => 78),
'fname' => array('length' => 40, 'start' => 98),
'lname' => array('length' => 40, 'start' => 138),
'suffix' => array('length' => 20, 'start' => 178),
'address' => array('length' => 35, 'start' => 198),
'postalcode' => array('length' => 10, 'start' => 233),
'city' => array('length' => 28, 'start' => 243),
'state' => array('length' => 5, 'start' => 271),
'greeting' => array('length' => 40, 'start' => 276)
);

$str = '4';
foreach($fields as $field_name => $field)
{
if($$field_name)
{
$str = str_pad($str, $field['start']-1, ' ');
$str = $str.substr(trim((string)$$field_name), 0, $field['length']);
}
}

return $str."\n";
}

它似乎按预期工作,但当我查看输出文件时,我发现了这个(滚动到末尾):

4                                                                 1                              David                                   Landrum
4 3 Hazel Baker
4 3 Jerome Zehnder
4 1 Víctor Nadales
4 2 Philip Nauert
4 1 Jana Ortcutter

该文件包含从数据库中提取的 900 条记录,除了 Véctor Nadales 之外,所有记录的格式都正确无误。在那个名字之后,每个其他字段都在它应该所在的位置左边三个空格。这张唱片唯一的异常之处似乎是名字中的“Ô。

该函数应该在它处理的每个字段之后将字符串填充到适当的长度,但它不知何故在这一行上被愚弄了?

谁能告诉我这是怎么回事?

编辑:我刚刚意识到这种格式的导入文件可能甚至不支持特殊的 UTF-8 字符。因此,我将这一行添加到我的代码中:

$$field_name = iconv('UTF-8', 'ASCII//TRANSLIT', $$field_name);

出现的 Ã 看起来像这样:~A-。不理想,但至少现在文件格式正确。

最佳答案

发生这种情况是因为 'Ã' 是一个多字节字符(4 个字节长),而 str_pad 正在计算字节而不是逻辑字符。

这就是您缺少三个空格的原因,str_pad'Ã' 计为 4 个单字节字符,而不是一个多字节字符。

试试这个函数(credit here)。

<?
function mb_str_pad( $input, $pad_length, $pad_string = ' ', $pad_type = STR_PAD_RIGHT)
{
$diff = strlen( $input ) - mb_strlen( $input );
return str_pad( $input, $pad_length + $diff, $pad_string, $pad_type );
}
?>

关于php - 特殊字符在 php 中丢弃 str_pad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11871811/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com