使用 sprintf 根据字母宽度对齐
Posted
技术标签:
【中文标题】使用 sprintf 根据字母宽度对齐【英文标题】:Aligning based on the width of letters with sprintf 【发布时间】:2012-02-06 20:21:01 【问题描述】:我正在尝试为电子邮件对齐基于文本的项目列表。基本上我遇到的问题是它只适用于固定宽度(等宽)字体 - 我想要一个脚本,它可以根据标准 Arialish 字体中每个字母的宽度以某种方式对齐它。
function sprintf_nbsp()
$args = func_get_args();
return str_replace(' ', ' ', vsprintf(array_shift($args), array_values($args)));
$format = '%-6s%-\'.35.35s...%\'.10s<br>';
$str = sprintf_nbsp($format, '1', 'A list of items - this is the first', '$49.99');
$str .= sprintf_nbsp($format, '100', 'This is something else', '$4.99');
$str .= sprintf_nbsp($format, '5', 'A book', '$499.99');
$str .= sprintf_nbsp($format, '16', 'Testing the function', '$49.99');
echo '<div style="font-family:Courier">'.$str."</div>";
echo '<br><br>'.$str;
(sprintf_nbsp() 可能不是必需的,我只是在 php 论坛上找到的,我对其他解决方案持开放态度)
【问题讨论】:
您无法在 PHP 中执行此操作,因为您无法确定 PHP 中每个字母的宽度 - 您需要 CSS 样式或等宽字体来实现所需的输出。 那么你建议我如何处理这个问题? 【参考方案1】:固定宽度(等宽)字体 - 我想要一个能够以某种方式实现的脚本 根据标准 Arialish 中每个字母的宽度对齐它 字体。
简单地说,这是不可能的。
对于固定-width字体,每个字符都具有相同的宽度,因此名称为固定宽度。
对于其他字体,情况并非如此。例如,您可以清楚地看到i
比M
窄得多。
您无法知道用户使用哪种字体,即使您指定了类似font-family: Arial
之类的内容,这可能并不总是有效,不同的系统(OSX、X11 等)使用不同的字体,并且一些用户还会覆盖字体网站的设置等
即使如果你知道 100% 确定用户使用哪种字体,几乎不可能将所有内容对齐到像素完美。
因此,您有两个选择:要么使用固定宽度的字体(“Consolas”是一种看起来相当不错的标准 Windows 字体),要么使用不同的布局。
你可能想要的是这样的:
<style>
span display: block; width: 20em;
</style>
<span>Some text</span>
<span>Hello, world!</span>
<span>A swallow could not carry a coconut</span>
在这里,每个 <span>
的宽度相同 (20em
),无论它包含多少文本。
使用空格来对齐内容几乎总是是个坏主意。使用 CSS 不仅更简洁,而且更容易。
【讨论】:
以上是关于使用 sprintf 根据字母宽度对齐的主要内容,如果未能解决你的问题,请参考以下文章
如何解压字符串 - 使用 sprintf 创建 - 在 Perl 中具有固定宽度