【问题标题】:PHP - how to determine the width of an character stringPHP - 如何确定字符串的宽度
【发布时间】:2021-05-06 09:08:11
【问题描述】:

我有一位客户想确定通过网络表单输入的字符串的长度。字符串的大小写可能混杂。

假设字体大小为 1 英寸高,即大约 72 磅。

72 磅的小写字母“s”比大写字母“S”窄。

我需要以英寸为单位显示结果。

PHP中有没有办法计算字符串的宽度??

【问题讨论】:

  • 没有 PHP。这是一个渲染值,而不是服务器值。 PHP 是一种服务器端语言。您必须使用 javascript 才能知道大小,但它会模棱两可,因为它在设备之间呈现不同。
  • 这根本不可能正确。它不仅取决于渲染字符串的字体,还取决于渲染字体的字体渲染器。结果可能会非常不同,具体取决于平台。你可能得到的最好的结果是一个粗略的球场
  • 这取决于很多因素。如果用户正在使用缩放怎么办?我能想象你能做到这一点的唯一方法是设置默认字体类型和大小。然后使用画布测量每个字符的大小。
  • 什么字体?什么分辨率?使用什么字距/缩放/间距因素?

标签: php


【解决方案1】:

您需要获取文本,并将其转换为图像,使用正确大小的字体等。谢天谢地,这对使用 php 来说并不是一项艰巨的任务。对于这种情况,我将假设有关字体等的一些细节,但请使用您自己的数据。

   <?php
    $text = "my string of text";

    $img = $imagecreatetruecolor(100,100); // SIZE DOESN'T MATTER REALLY THIS TIME
    $fontSize = 72; //FONT SIZE
    $fontFile = "arial.ttf" // PUT THE RELEVANT FONT FILE IN THE SAME DIRECTORY AS THIS SCRIPT
    $boundingBox = imagettfbbox($fontSize, 0, $fontFile, $text); //RETRIEVE THE BOUNDING BOX OF THE TEXT RENDERED
    $width = $boundingBox[2] - $boundingBox[0]; //WIDTH IN PIXELS AT 72dpi
    $inchesWidth = $width/72;
    echo $inchesWidth;
    ?>

由于系统之间的间距不同,它不会 100% 准确,但应该会给你一个很好的猜测。

【讨论】:

  • 耶!很高兴听到它,如果您能接受我的答案,将不胜感激!祝 Bob 项目的其余部分好运:)
【解决方案2】:

这在 Unicode 标准附件 #11 中被引用 东亚宽度,所以我们要解析如下文件:

# Unicode Character Database
# For documentation, see http://www.unicode.org/reports/tr44/
#
# East_Asian_Width Property
#
# This file is a normative contributory data file in the
# Unicode Character Database.
#
# The format is two fields separated by a semicolon.
# Field 0: Unicode code point value or range of code point values
# Field 1: East_Asian_Width property, consisting of one of the following values:
#         "A", "F", "H", "N", "Na", "W"

00AB;N           # Pi         LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
00AC;Na          # Sm         NOT SIGN
00AD;A           # Cf         SOFT HYPHEN
00AE;A           # So         REGISTERED SIGN
00AF;Na          # Sk         MACRON
00B0;A           # So         DEGREE SIGN
00B1;A           # Sm         PLUS-MINUS SIGN
00B2..00B3;A     # No     [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
00B4;A           # Sk         ACUTE ACCENT
00B5;N           # Ll         MICRO SIGN
00B6..00B7;A     # Po     [2] PILCROW SIGN..MIDDLE DOT
(...)

http://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt

http://www.unicode.org/reports/tr11/tr11-38.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多