Skip to content

Instantly share code, notes, and snippets.

@xtetsuji
Created January 31, 2024 14:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xtetsuji/0d9295ec98f9bdb964bd978ab4ec4876 to your computer and use it in GitHub Desktop.
Save xtetsuji/0d9295ec98f9bdb964bd978ab4ec4876 to your computer and use it in GitHub Desktop.
Japanese prefecture name sort on some Japanese character sets.
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use utf8;
binmode STDOUT, ':utf8';
use Encode;
# 都道府県の漢字表記を北海道から沖縄県まで
my @prefs = (
'北海道', '青森県', '岩手県', '宮城県', '秋田県',
'山形県', '福島県', '茨城県', '栃木県', '群馬県',
'埼玉県', '千葉県', '東京都', '神奈川県', '新潟県',
'富山県', '石川県', '福井県', '山梨県', '長野県',
'岐阜県', '静岡県', '愛知県', '三重県', '滋賀県',
'京都府', '大阪府', '兵庫県', '奈良県', '和歌山県',
'鳥取県', '島根県', '岡山県', '広島県', '山口県',
'徳島県', '香川県', '愛媛県', '高知県', '福岡県',
'佐賀県', '長崎県', '熊本県', '大分県', '宮崎県',
'鹿児島県', '沖縄県',
);
my @encodings = (qw/utf-8 shift_jis euc-jp iso-2022-jp/);
# %sort_by_encoding - 文字コードをキーとしたソート済みの都道府県リスト
# 値の配列リファレンス中の都道府県文字列は、指定の文字コードのバイト列ではなく Perl 内部文字にアップグレードしたものになっている
# %sort_by_encoding_on = (
# "euc-jp" => ["愛知県", "愛媛県", "茨城県", ...],
# ...
# );
my %sort_by_encoding_on;
for my $encoding (@encodings) {
# sort は与えられた文字コードでエンコードした順にソートする
$sort_by_encoding_on{$encoding} = [
map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, encode($encoding, $_)] } @prefs
];
}
# 行として文字コード降順の都道府県、列として文字コード @encodings とした表を出力
# 表の各セルには、その文字コードでソートした都道府県を出力
say join "\t", @encodings;
for my $i (0..46) {
say join "\t", map { $sort_by_encoding_on{$_}->[$i] } @encodings;
}
$ perl tmp/table-pref-sort.pl
i utf-8 shift_jis euc-jp iso-2022-jp
0 三重県 愛知県 愛知県 愛知県
1 京都府 愛媛県 愛媛県 愛媛県
2 佐賀県 茨城県 茨城県 茨城県
3 兵庫県 岡山県 岡山県 岡山県
4 北海道 沖縄県 沖縄県 沖縄県
5 千葉県 岩手県 岩手県 岩手県
6 和歌山県 岐阜県 岐阜県 岐阜県
7 埼玉県 宮崎県 宮崎県 宮崎県
8 大分県 宮城県 宮城県 宮城県
9 大阪府 京都府 京都府 京都府
10 奈良県 熊本県 熊本県 熊本県
11 宮城県 群馬県 群馬県 群馬県
12 宮崎県 広島県 広島県 広島県
13 富山県 香川県 香川県 香川県
14 山口県 高知県 高知県 高知県
15 山形県 佐賀県 佐賀県 佐賀県
16 山梨県 埼玉県 埼玉県 埼玉県
17 岐阜県 三重県 三重県 三重県
18 岡山県 山形県 山形県 山形県
19 岩手県 山口県 山口県 山口県
20 島根県 山梨県 山梨県 山梨県
21 広島県 滋賀県 滋賀県 滋賀県
22 徳島県 鹿児島県 鹿児島県 鹿児島県
23 愛媛県 秋田県 秋田県 秋田県
24 愛知県 新潟県 新潟県 新潟県
25 新潟県 神奈川県 神奈川県 神奈川県
26 東京都 青森県 青森県 青森県
27 栃木県 静岡県 静岡県 静岡県
28 沖縄県 石川県 石川県 石川県
29 滋賀県 千葉県 千葉県 千葉県
30 熊本県 大阪府 大阪府 大阪府
31 石川県 大分県 大分県 大分県
32 神奈川県 長崎県 長崎県 長崎県
33 福井県 長野県 長野県 長野県
34 福岡県 鳥取県 鳥取県 鳥取県
35 福島県 島根県 島根県 島根県
36 秋田県 東京都 東京都 東京都
37 群馬県 徳島県 徳島県 徳島県
38 茨城県 栃木県 栃木県 栃木県
39 長崎県 奈良県 奈良県 奈良県
40 長野県 富山県 富山県 富山県
41 青森県 福井県 福井県 福井県
42 静岡県 福岡県 福岡県 福岡県
43 香川県 福島県 福島県 福島県
44 高知県 兵庫県 兵庫県 兵庫県
45 鳥取県 北海道 北海道 北海道
46 鹿児島県 和歌山県 和歌山県 和歌山県
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment