1

我有一个关于处理俄语字符以呈现首字母的问题。

1) 我的 html 文档声明了 utf-8:

<meta charset="utf-8">

2)我的 MySQL 数据库中的名称字段是:

utf8_unicode_ci

3)当我查询一个名为的用户名时:

Богдан Доминика

var_dump 给出:

string(23) "Ð”Ð°Ñ€ÑŒÑ Ð Ñбова"

4)当我这样做时:

echo mb_detect_encoding($name)

我得到:

UTF-8

5)用户在前端看到这个(这是正确的):

Богдан Доминика

我想要的是:

6)但我想得到名字的首字母并将它们打印出来。如果我这样做(缩减版):

$initials = substr($first_name, 0, 1) . substr($second_name, 0, 1)

7)我在前端得到这个:

�Р

8)如果我取名字和名字的前两个字符,我会得到我想要的结果:

БД

问题:

如何确定 3) 中的字符串是俄语(或任何其他字符集)?

4

3 回答 3

4

需要用到PHP的多字节函数...比如mb_substr http://us3.php.net/mb_substr

于 2013-06-28T21:01:37.530 回答
0

我相信有一个检测俄罗斯编码的错误。见https://bugs.php.net/bug.php?id=38138

摘抄:

mb_detect_encoding 中的俄语编码检测被禁用,尽管它存在于支持的编码列表中。它只是三个相当简单的编码——windows-1251、cp866 和 koi8-r,它们破坏了俄罗斯程序员的日常生活,并使 PHP 对数百万潜在的 PHP 开发人员的吸引力降低。

为此,您可能需要使用不同的函数,例如mb_substr()

于 2013-06-28T21:06:05.307 回答
0

俄语是一种语言,而不是字符集。Unicode(以 UTF-8 编码)包含所有世界语言的字符,并且是您应该使用的唯一字符集。特定于语言的字符集,例如带有变音符号的英语和欧洲语言(例如德语、法语和瑞典语)的 ISO-8859-1 和西里尔字母的 ISO-8859-5 是 ASCII 的传统扩展,仅限于特定的脚本. 使用 Unicode(通过 UTF-8)可以让您的脚本支持所有可能的字符。

如果您正确使用 Unicode ,您正在处理的文本的语言和脚本将变得无关紧要。这意味着如果您mb_正确使用多字节扩展(以 开头的那些函数),则无需担心您正在处理的语言。

但是,让我们继续讨论您的具体问题。首先,使用Content-TypeHTTP 标头设置正确的编码而不是meta标记。将以下内容添加到脚本的开头并删除meta标记:

header("Content-Type: text/html; charset=utf-8");

这也应该修复var_dump输出。

接下来,要获取全名的首字母,您需要执行以下操作:

  1. 拆分名称以获得名字和姓氏。
  2. 获取每个元素的第一个字母。
  3. 组合字母得到首字母。

试试这个例子:

<?php

header("Content-Type: text/html; charset=utf-8");

if(isset($_POST['name'])) {
    $full_name = $_POST['name'];

    // split the name on whitespace, this includes Unicode characters
    // that represent whitespace but are not 0x20 (ASCII space)
    $elements = preg_split('/\s+/', $full_name);

    // get the initials
    $initials = '';
    foreach($elements as $element) {
        $initials .= mb_substr($element, 0, 1, 'UTF-8');
    }

    echo "<p>Your initials are: ", $initials, "</p>\n";
}

?>

<form action="" method="POST">
    <p>
        Please enter your name:
        <input type="text" name="name" />
        <input type="submit" />
    </p>
</form>

我已经在https://peschar.net/files/initials.php为您提供了一个演示。

于 2013-06-28T21:18:55.453 回答