php - 从 PHP 中的字符串检测字符串方向

标签 php

我正在使用 php-gd 创建一些文本,但文本编码和方向存在问题 我使用的是阿拉伯语,它是 rtl 语言,而且在同一张图片中还会有额外的英语短语。

问题:

imagettftext($image, 18, 0, 317, 141,$font_color, 'breeco.ttf', $Arabic->utf8Glyphs($friends[0]['name']));

如果文本是英文“ltr”,它的 x 位置是 317,这是正确的 但是当它处于 rtl 时,它将具有相同的 317 x 位置并且它是不正确的

有没有办法检测字符串的 rtl?

最佳答案

这实际上比它应该的更棘手。每个 Unicode 字符都有信息告诉我们它是 RTL 还是 LTR 字符,但我没有在 PHP 中看到读取此信息的方法 - 相反,您需要在 Unicode 字符表中查找此信息。

我在下面整理了一个相当低效的解决方案,但我建议查看此 PHP implementation of Stringprep如果你需要更强大的东西。该库还将检查字符串的有效性,例如它可以强制执行诸如“不能在同一字符串中混合使用 RTL 和 LTR 字符”之类的规则。但是,它是为准备在 Internet 协议(protocol)中使用的字符串而不是标准文本而设计的,因此它施加的限制可能会妨碍简单地使用它来检查文本方向。

感谢this StackOverflow 回答有关从何处获取 Unicode 数据以及如何解释的信息。

首先我们可以创建一个文件,其中只包含具有双向属性的字符,称为“R”或“AL”(RandALCat),它存储在 Unicode data 的第 5 个字段中.此命令从该 URL 获取数据,删除第 5 个字段中没有 AL 或 R 的字符,将剩余的十六进制代码填充为 6 个字符,并将其保存在名为 RandALCat.txt 的文件中。

curl http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt |  \
    egrep -e "([^;]*;){4}(AL|R);.*" | \
    awk -F";" '{ printf("%06s\n", $1) }' > RandALCat.txt

然后我们可以在一个函数中使用这个文件来测试字符串中的每个字符:

<?php

function isRTL($testString) {

    $RandALCat = file('RandALCat.txt', FILE_IGNORE_NEW_LINES);
    $codePoints = unpack('V*', iconv('UTF-8', 'UTF-32LE', $testString));

    foreach ($codePoints as $codePoint) {
        $hexCode = strtoupper(str_pad(dechex($codePoint), 6, '0', STR_PAD_LEFT));
        if (array_search($hexCode, $RandALCat)) {
            return true;
        }
    }

    return false;

}

$englishText = 'Hello';
$arabicText = 'السلام عليكم';

var_dump(isRTL($englishText));
var_dump(isRTL($arabicText));

如果将其保存为 test.php 或其他文件然后运行它,您应该会看到以下输出:

$ php -q test.php
bool(false)
bool(true)

关于php - 从 PHP 中的字符串检测字符串方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20861663/

相关文章:

php - 将多维数组的Key和Value插入到mysql表中

php - 动态内容选择不起作用

php - 绑定(bind)变量的数量与php和android中的prepared语句中的字段数不匹配

php - 浏览器不读取解码的 html_entity_decode 文本

PHP 代码点火器 : insert parent_id automatically to mysql

PHP从Assoc数组中获取字符串值并将其转换为字符串进行比较

php - 将值插入 SQL 下拉列表中的变量

php - 使用 Jquery 只保留 html 中的某些元素

javascript - 使用 jQuery、laravel 5.3 在提交时将表单数据发送到 div,在表单外

php - Piwik 安装不工作