对片假名进行排序

时间:2011-04-09 03:14:29

标签: php sorting unicode

如果我有一个片假名列表,那么对它们进行排序的最佳方法是什么? 此外,更常见的是根据名字{名字} {姓氏}或{姓名} {名字}对名称进行排序。 另一个问题是我们如何获得片假名的第一个字符平假名表示,如何对iPhone的联系人列表进行排序。 感谢。

3 个答案:

答案 0 :(得分:1)

在日本,通常(如果没有预料到)一个人的姓氏在姓氏后出现:{last} {first}。但这也取决于具体情况。在不太正式的上下文中,名称可以显示为{first} {last}。

http://en.wikipedia.org/wiki/Japanese_name

这不重要,但为什么个人的名字应该用片假名而不是传统的汉字?

答案 1 :(得分:0)

我认为是

sort($array,SORT_LOCALE_STRING);

如果不是您的情况,请提供更多信息

答案 2 :(得分:0)

This answer讨论使用系统区域设置在PHP中对Unicode字符串进行排序。除了线程问题之外,它还取决于您的供应商为您提供了正确的区域设置以供您使用。我在使用供应商区域设置完全放弃的那个特定问题上遇到了很多麻烦。

如果您担心Unihan表意文字的不同发音,那么您可能需要访问the Unihan database - 或其道德等同物。较小的子集可能就足够了。

例如,我知道在Perl中,JIS X 0208 standard是在Unicode::Collate::Locale的构造函数中选择日语“ja”语言环境时使用的。这不依赖于系统区域设置,因此可以依赖它。

我在使用Lingua::JA::Romanize::Japanese的Perl中也有好运,因为使用它比直接访问Unicode::Unihan更友好。

回到PHP。 This article注意到你无法让PHP正确排序日语。

我已经采用了他的字符串并通过Perl的类型运行它,我确实得到了与他得到的不同的答案。如果我使用默认或英语语言环境,我会在Perl中获得他在PHP中获得的内容。但是如果我使用日语语言环境作为校对模块 - 它与系统语言环境无关并且完全是线程安全的 - 那么我会得到一个相当不同的结果。观看:

JA Sort                          = EN Sort
------------------------------------------------------------
Java                               Java
NVIDIA                             NVIDIA
Windows ファイウォール             Windows ファイウォール
インターネット オプション          インターネット オプション
キーボード                         キーボード
システム                           システム
タスク                             タスク
フォント                           フォント
プログラムの追加と削除             プログラムの追加と削除
マウス                             マウス
メール                             メール
音声認識                         ! 地域と言語オプション
画面                             ! 日付と時刻
管理ツール                       ! 画面
自動更新                         ! 管理ツール
地域と言語オプション             ! 自動更新
電源オプション                     電源オプション
電話とモデムのオプション           電話とモデムのオプション
日付と時刻                       ! 音声認識

我不知道这对你是否会有所帮助,因为我不知道如何从PHP获取Perl位(可以吗?),但这里是程序产生那个。它使用CPAN安装的几个非标准模块来开展业务。

#!/usr/bin/env perl
#
# jsort - demo showing how Perl sorts Japanese in a 
#          different way than PHP does.
#
# Data taken from http://www.localizingjapan.com/blog/2011/02/13/sorting-in-japanese-—-an-unsolved-problem/
#
# Program by Tom Christiansen <tchrist@perl.com>
# Saturday, April 9th, 2011

use utf8;
use 5.10.1;
use strict;
use autodie;
use warnings;
use open qw[ :std :utf8 ];

use Unicode::Collate::Locale;
use Unicode::GCString;

binmode(DATA, ":utf8");

my @data = <DATA>;
chomp @data;

my $ja_sorter = new Unicode::Collate::Locale locale => "ja";
my $en_sorter = new Unicode::Collate::Locale locale => "en";

my @en_data = $en_sorter->sort(@data);
my @ja_data = $ja_sorter->sort(@data);

my $gap = 8;
my $width = 0;
for my $datum (@data) {
    my $columns = width($datum);
    $width = $columns if $columns > $width;
}
my $bar = "-" x ( 2 + 2 * $width + $gap );
$width = -($width + $gap);
say justify($width => "JA Sort"), "= ", "EN Sort";
say $bar;

for my $i ( 0 .. $#data ) {
    my $same = $ja_data[$i] eq $en_data[$i] ? " " : "!";
    say justify($width => $ja_data[$i]), $same, " ", $en_data[$i];
}

sub justify {
    my($len, $str) = @_;
    my $alen = abs($len);
    my $cols = width($str);

    my $spacing = ($alen > $cols) && " " x ($alen - $cols);

    return ($len < 0)
        ? $str . $spacing
        : $spacing . $str

}

sub width {
    return 0 unless @_;
    my $str = shift();
    return 0 unless length $str;
    return Unicode::GCString->new($str)->columns;
}


__END__
システム
画面
Windows ファイウォール
インターネット オプション
キーボード
メール
音声認識
管理ツール
自動更新
日付と時刻
タスク
プログラムの追加と削除
フォント
電源オプション
マウス
地域と言語オプション
電話とモデムのオプション
Java
NVIDIA

希望这会有所帮助。它表明,至少在理论上它是可行的。


修改

How can I use Perl libraries from PHP?引用this PHP package的答案为您做到了这一点。因此,如果您没有找到包含所需日语排序内容的PHP库,您应该能够使用Perl模块。您唯一需要的是Unicode::Collate::Locale。它是5.14版本的标准版(实际上是5.13.4,但这是一个开发版本),但是如果你有早期版本的Perl,你可以随时从CPAN安装它。