Этот ответ говорит об использовании языкового стандарта системы для сортировки строк Unicode в PHP.Помимо проблем с многопоточностью, это также зависит от того, предоставил ли ваш поставщик правильную локаль для того, что вы хотите использовать.У меня было так много проблем с этой конкретной проблемой, что я полностью отказался от использования локалей вендоров.
Если вы беспокоитесь о различном произношении иероглифов Unihan, то вам, вероятно, нужен доступ к База данных Unihan - или ее моральный эквивалент.Меньшего подмножества может быть достаточно.
Например, я знаю, что в Perl стандарт JIS X 0208 используется, когда в конструкторе для * 1011 выбран японский языковой стандарт "ja" для* Unicode :: Разобрать :: Locale .Это не зависит от языкового стандарта системы, поэтому вы можете положиться на него.
Мне также повезло в Perl с Lingua :: JA :: Romanize :: Japanese , так как это несколько удобнее, чем доступ к Unicode :: Unihan напрямую.
Вернуться к PHP. Эта статья отмечает, что вы не можете заставить PHP правильно сортировать японский.
Я взял его набор строк и провел его через сортировку Perl, и я действительно получил ответ, отличный отон получает.Если я использую стандартную или английскую локаль, я получаю в Perl то, что он получает в PHP.Но если я использую японский языковой стандарт для модуля сопоставления - который не имеет ничего общего с системным языковым стандартом и является полностью поточно-ориентированным - тогда я получу довольно другой результат.Смотрите:
JA Sort = EN Sort
------------------------------------------------------------
Java Java
NVIDIA NVIDIA
Windows ファイウォール Windows ファイウォール
インターネット オプション インターネット オプション
キーボード キーボード
システム システム
タスク タスク
フォント フォント
プログラムの追加と削除 プログラムの追加と削除
マウス マウス
メール メール
音声認識 ! 地域と言語オプション
画面 ! 日付と時刻
管理ツール ! 画面
自動更新 ! 管理ツール
地域と言語オプション ! 自動更新
電源オプション 電源オプション
電話とモデムのオプション 電話とモデムのオプション
日付と時刻 ! 音声認識
Я не знаю, поможет ли это вам вообще, потому что я не знаю, как получить биты Perl из PHP ( вы можете? ), но вот программа, которая генерирует это.Для своей работы он использует несколько нестандартных модулей, установленных из 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
Надеюсь, это поможет.Это показывает, что это, по крайней мере теоретически, возможно.
РЕДАКТИРОВАТЬ
Этот ответ от Как я могу использовать библиотеки Perl из PHP? ссылки этот пакет PHP , чтобы сделать это для вас.Так что, если вы не найдете библиотеку PHP с необходимыми японскими средствами сортировки, вы сможете использовать модуль Perl.Вам нужен только Unicode :: Collate :: Locale .Начиная с версии 5.14 он поставляется стандартно (на самом деле 5.13.4, но это версия devel), но вы всегда можете установить его из CPAN, если у вас более ранняя версия Perl.