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 - 冲洗甚至 ob 冲洗不起作用

php - 有没有更有效的方法?

php - MySQL 慢检查大表中是否存在行

php - 如何在浏览器关闭时删除 session cookie

php - 包括整个 php 目录

php - NSIS 和 PHP 之间的 Blowfish 加密消息

php - 更新表格

php - 如何将平面列表变成嵌套数组?

php - Laravel 5 原始选择查询不返回任何内容

php - 如何获得实时更新?