お世話になります。
2006年に発行された「まるごとPerl」というムックの「まるごとEncode」という記事を見て Perl の日本語処理の勉強をしています。
本記事は Perl5.8 対象と思われますが私は Strawberry Perl 5.10.0 を Windows XP SP3 で使っています。
#! perl
# list1 -- 日本語の文字を1文字として解釈(UTF-8で保存)
use strict;
use warnings;
use utf8;
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4);
というサンプルコードがあって、実行結果は「カタカナ」になると書いてあります。
要するに substr 関数が use utf8; によってバイト単位ではなくて文字単位で効くようになるので、4文字目から4文字が正しく取ってこられるという実験ですが、Windows の DOS 窓で実験すると、当然端末コードは Shift_JIS というか CP932 ですので、
Wide character in print at C:\Marugoto\list1.pl line 8.
繧ォ繧ソ繧ォ繝
となります。
そこで、上のコードに binmode 関数を足して、
#! perl
# list1 -- 日本語の文字を1文字として解釈(UTF-8で保存)
use strict;
use warnings;
use utf8;
binmode STDOUT, ':encoding(cp932)'; # 追加
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4);
とすると正しく動作しました。
次に、
#! perl
# list2 -- 1オクテットを1文字として解釈(UTF-8で保存)
use strict;
use warnings;
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 9, 12);
というリストがあって、今度は use utf8; がないのでバイトモードで使う(substr 関数は 9 バイト目から 12 バイトを取ってくる。UTF-8 は全角日本語文字が1文字3バイトなので)という実験ですが、これもそのまま DOS 窓で実行すると
繧ォ繧ソ繧ォ繝
となるので、さっきと同じように binmode 関数を使って、
#! perl
# list2 -- 1オクテットを1文字として解釈(UTF-8で保存)
use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 9, 12);
と書いたのですが、
・\x{0082}" does not map to cp932.
"\x{0082}" does not map to cp932.
"\x{00bf}" does not map to cp932.
"\x{0082}" does not map to cp932.
"\x{0083}" does not map to cp932.
"\x{008a}" does not map to cp932.
a\x{0082}≪a\x{0082}\x{00bf}a\x{0082}≪a\x{0083}\x{008a}
のようになりました。
もちろん、プログラムを Shift_JIS で保存して substr($text, 6, 8) とすれば正しく実行できますが、プログラムを UTF-8 で保存しつつ、Windows で正しく表示する方法はあるでしょうか。
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
表示するときに
print Encode::decode('utf8', substr($text, 9, 12));
とする.
そもそも 12文字表示されているという時点で「UTF-8 と思われていない」ことに気づかなきゃ.
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Perl perlについての質問 2 2022/10/17 15:25
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- 英語 Although bleeding does not occur on every occasion 1 2023/03/03 20:10
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perl でエラー:Wide character...
-
WindowsでUTF-8のPerlスクリプ...
-
$obj->decode($bytes)って何?
-
jcode.plのかわり
-
MFCのコントロールにUTF-8の文...
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
CString から LPCTSTRの型に変換
-
エクセルで数値を全角文字(カ...
-
「何とかで始まり、何とかで終...
-
VBA 文字に半角が含まれて...
-
EXCELからCSVにすると余計なカ...
-
正規表現で、特定の文字列を含...
-
ダブルコーテーションの置換
-
データにカンマが入ったCSVデー...
-
VBA 置換文字がみつからない時
-
カンマ区切りの数字をCSVフ...
-
マクロを使ってフォルダー内に...
-
VBで、String型のデータが、...
-
各項目がダブルクォーテーショ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perl でエラー:Wide character...
-
jcode.plのかわり
-
MFCのコントロールにUTF-8の文...
-
【LaTeX】pBibTeXでのエラーの...
-
Perlで、文字の出現回数を調べ...
-
Cannot decode string with wid...
-
PerlでRSS取得 ~ 文字化け ~ ...
-
PHPの文字化けについて
-
HTML::Templateでutf-8のテンプ...
-
printfの書式指定での2バイト文...
-
sedやperlでの2バイト文字を含...
-
pythonの文字コードとファイル操作
-
デバッグ情報が文字化けする
-
JAVAでMySQLに接続すると日本語...
-
Java+MySQLで特殊文字(丸数字(...
-
オブジェクト? perlをオーバー...
-
WWW::Mechanizeの文字コードに...
-
UTF-16からUTF-8への変換
-
機種依存文字(株)を入力すると\...
-
XMLパラメータの取り込みに関して
おすすめ情報