teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

内容を改善

2021/09/06 18:52

投稿

harrek
harrek

スコア123

answer CHANGED
@@ -1,6 +1,45 @@
1
- ソースコードをutf-8で書いているなら最初の方に`use utf8;`を追加すると動くかもしれません。
1
+ 7???ソースコードをutf-8で書いているなら最初の方に`use utf8;`を追加すると動くかもしれません。
2
2
 
3
3
  ただ、私はこのモジュールを知らないので単なる疑問なのですが、
4
4
  文字コードを変換するだけならPerl標準で付いている
5
5
  Encodeモジュールを使った方が良さそうに思えますが、
6
- このモジュールでないとできないことがあるのでしょうか?
6
+ このモジュールでないとできないことがあるのでしょうか?
7
+
8
+ ---
9
+ (追記)
10
+
11
+ なるほど、「utf-8にはcp932の範囲を超えた漢字などがありまして、頃合いのいい何かに変換できていればいいのですが…」というのがキモですね。
12
+
13
+ 残念ながら ShiftJIS::CP932::MapUTF はその変換を自動ではやってくれないので、どの文字をどの文字に割り当てるかを自分で指定する必要があります。
14
+
15
+ ```perl
16
+ use strict;
17
+ use warnings;
18
+ use ShiftJIS::CP932::MapUTF;
19
+
20
+ # Unicode符号位置, SJISコード,
21
+ my %conv = (
22
+ 0x555e, 0x88a0,
23
+ );
24
+
25
+ sub toHexNCR {
26
+ my ($char, $byte) = @_;
27
+ if (!defined $char){
28
+ return sprintf "illegal byte 0x%02x was found", $byte;
29
+ }
30
+ my $c = $conv{$char};
31
+ if (defined $c){
32
+ return pack('n', $c);
33
+ } else {
34
+ return sprintf("&#x%x;", $char);
35
+ }
36
+ }
37
+
38
+ print(utf8_to_cp932(\&toHexNCR, '啞あ','g'));
39
+ ```
40
+
41
+ (`use utf8;` は不要でした…)
42
+
43
+ これの7行目のように、元のUnicode符号位置とSJISコードの組を自分で指定することで「頃合いのいい何か」に変換することになります。
44
+
45
+ このコードでは「啞」だけを変換していますが、この行をコピペして下に増やして行けば複数の文字でも対応できるはずです。