「ウェブリブログ」は 2023年1月31日 をもちましてサービス提供を終了いたしました。 2004年3月のサービス開始より19年近くもの間、沢山の皆さまにご愛用いただきましたことを心よりお礼申し上げます。今後とも、BIGLOBEをご愛顧賜りますよう、よろしくお願い申し上げます。 ※引っ越し先ブログへのリダイレクトサービスは2024年1月31日で終了いたしました。 BIGLOBEのサービス一覧

「ウェブリブログ」は 2023年1月31日 をもちましてサービス提供を終了いたしました。 2004年3月のサービス開始より19年近くもの間、沢山の皆さまにご愛用いただきましたことを心よりお礼申し上げます。今後とも、BIGLOBEをご愛顧賜りますよう、よろしくお願い申し上げます。 ※引っ越し先ブログへのリダイレクトサービスは2024年1月31日で終了いたしました。 BIGLOBEのサービス一覧
id:tomi-ru さんが [http://e8y.net/mag/015-encode/:title] というとてもプラクティカルな [http://search.cpan.org/perldoc?Encode:title=Encode] 入門をお書きになったので,わたしも違う切り口で書いてみたくなりました。 いちおうの基礎(読み飛ばし可) 文字セット, キャラクタセット, 文字集合, 文字集合 - Wikipedia エンコーディング, 符号化方式, 文字符号化方式 - Wikipedia この2つは異なります。とくに知らなくても下記の文書を読むことはできますが,理解しているとためになります。くわしく知りたい人は自習してください。 文字セットの例 Unicode JIS X 0208 ひらがなとかカタカナとか漢字とか ASCII 文字 エンコーディングの例 UTF-8 ISO-202
宣伝と注意書き このサイトが元になったCPANモジュールガイドという本を書きました。 本書でも取り上げています。 このページにあることは間違いではないのですが、「UTF8フラグ」「Unicode」「文字列」「バイト列」このあたりについて、より正確で簡潔な解説を心がけました。また、全編を通して日本語を扱う方法もふれています。 2008-06-11 use Encode; 日本語/フラグ周りでつまづくのはありがちなので落ち込む必要はないです。この連載も「そろそろ日本語の話題か・・」と思ったのですが、まとめるのがめんどうでテラ放置してました。 すでにたくさんの資料が出回っていることを踏まえ違う切り口でまとめてみます(少々乱暴な部分もあるので、後で ADVANCED も見て下さい)。 まず、以下はそれぞれだいたい同じものと考えていいです。 A: 文字列、 ユニコード(Unicode)、 utf8フ
UTF8 フラグあれこれ - daily dayflower について nobuoka さんよりツッコミをいただきました。 nobuoka 2008/03/11 21:15 こんにちは。”[Perl] Perl の Unicode 対応について” のエントリでトラックバックさせて頂きました nobuoka です。 内部表象 (内部形式: internal format) について気になる点があったのでいろいろ調べていたのですが、「内部形式は UTF-8 ではなく Unicode コードポイントをバイナリ化したものである」という結論に達しました。たとえば「é」という文字は内部形式では ¥xE9 というバイナリデータとして保持されているという結論に達しました。それは utf8 フラグが付いていても付いていなくても同様です。 つまり、このエントリで述べられている (A) 文字列(内部表象: UT
前回の記事が期せずしてホッテントリ入りしたので,ちょっとマズいと思い。 前回の記事が難しいと思ったとしても,それは恥ずべきことではありません。 あくまで Perl の内部構造の話ですから*1。 ただ,Perl で文字列を扱う/文字コードを扱うのは難しい,と思われるのは本位ではないです。 というのは,本当は,難しく考えなくでも動くように作られてますから。 拙い表現なもので上から目線に感じられたらごめんなさい。 もうちょっと詳しく書きます。 Perl の文字列の扱いは,なるべく後方互換性を確保しながら,進化してきました。 そのため,いろいろな思想,組み方でも動くようにできています。たとえば 文字コード,何それ,気にしない すべてバイナリ列だとみなす(上とほぼ同じ意味ですが) 内部コーディングを EUC-JP octet stream にする 内部コーディングを UTF-8 octet stre
UTF8 フラグについてわかってるつもりだったんですが,utf8::is_utf8 considered harmful - Bulknews::Subtech - subtech を読んで混乱したので,自分なりにまとめてみました。間違いがありましたらご指摘よろしく。 まとめ スカラー変数の内部表象の状態を示すものとして UTF8 フラグというものがある スカラー変数は(リファレンス等は別として)下記のものを格納できる (A) 文字列(内部表象: UTF-8) (B) 文字列(内部表象: ISO-8859-1) (C) バイナリ列 純粋なバイナリストリーム(画像ファイル等)かもしれないし, UTF-8 octet stream かもしれないし, CP932 octet stream かもしれないし,etc, etc ... Perl は(後方互換性確保などの理由から)ISO-8859-1
Perl では Unicode のファイルを読み込んでも自動的にBOMを削ってくれない。過去に自分でも削ってくれるプログラムも書いた。 (「Perl 5.8.x で BOM を扱う」を参照) 最近、File::BOM というモジュールをCPANで発見した。いつのまにか、ActiveState のPPMのサイトにもアップロードされていた(つまり、バンドルされていないが、CPAN File::BOM で ActivePerl 5.10.0なら ppm install File::BOM とかでインストールできるということ)。 何通りかの使い方がある。ファイルを読み込んだとき、Encoding を知りたいのであれば、bom_open 関数が使える。 ちなみにこんな感じになる。 use utf8; use open ":encoding(cp932)",":std"; use File::BOM
perldoc の Encode::JP を読むと、Shift JISには3種類ある。 shiftjis - MS KanjiCP932 - CODE PAGE 932 = Shift JIS + MS/IBM vendor mappingsMacJapanese - Shift JIS + Apple vendor mappings うっすらとわかっているけれど、気持ち悪いので調べてみた。 Wikipedia に詳しい解説があった。 shiftjis - http://ja.wikipedia.org/wiki/Shift_JISCP932 - http://ja.wikipedia.org/wiki/CP932MacJapanese - http://ja.wikipedia.org/wiki/MacJapanese この3つの encoding について具体的に把握する方法を考えてみ
Perl 5.8.X 以降で、プログラムの先頭で use encoding 'shiftjis'; と宣言すると… 標準入出力(STDIN, STDOUT)が :encoding(shiftjis)になる ソースファイル中の文字列が実行前に UTF-8に変換される ここまでは perldoc encoding とするとEUC-JPを例に英語で解説されている。 次のプログラムをテキストエディタで入力してShift-JISコードで保存して実行してみるとわかりやすい。 use encoding "shiftjis"; use Data::Dump qw/dump/; print "1:","\x{8868}","\n"; print "2:","\x95\x5C","\n"; print "3:",dump("表"),"\n"; 実行すると次のような結果になる。 1:表 2:表 3:"\x{88
わりとよく使っているらしいWindows 環境 のjperl(ActivePerl 5.005へのパッチか?) のプログラムが動かないといわれたので、ActivePerl 5.8.X で動くように修正した。 プログラムの内容はShift-JISのテキストファイルを特定の形式に変更するもの。プログラムの内容はできるだけ修正したくないので、ソースファイルを UTF-8 に変更しプログラムの先頭に次の行を追加した。 use utf8; use open IO => ":encoding(cp932)", ":std"; つまり、1行めでソースコードは utf8であることを明示。2行目で機種依存コードを含む Shift-JISコードファイルの入出力を行い、ついでに標準入出力も Shift-JISに設定したということ。 これで処理すべきファイル8個のファイルのうち7個までは正常に処理できた。 異常の
エンコードの処理の基本 Perl 5.8 以降,テキストの処理が UTF-8 (Unicode の変換形式のひとつ) を軸におこなわれるようになりました。Shift JIS や EUC-JP での処理が一般的な日本語を Perl で扱う場合,エンコードを意識したプログラミングをおこなうことが必要になります。具体的には,Perl でエンコードを意識する必要のあるのは以下の箇所です。 スクリプト自体のエンコード ファイルの入出力 標準入出力 標準エラー出力 データベース,CGIなどプロセス間のインターフェース Perl 5.8 では内部処理が UTF-8 で行われますが,特にエンコードの指定がされない場合,テキストは文字単位ではなく,バイト単位で処理されます。バイト単位で Shift JIS などのテキストを処理することもある程度可能ですが,2バイトの文字が文字として認識されていませんから,正
「ウェブリブログ」は 2023年1月31日 をもちましてサービス提供を終了いたしました。 2004年3月のサービス開始より19年近くもの間、沢山の皆さまにご愛用いただきましたことを心よりお礼申し上げます。今後とも、BIGLOBEをご愛顧賜りますよう、よろしくお願い申し上げます。 ※引っ越し先ブログへのリダイレクトサービスは2024年1月31日で終了いたしました。 BIGLOBEのサービス一覧
perl tips - Encodeを速く使う方法によると、find_encoding を使うと、Encode による文字変換が早くなるらしいということで実験してみました。 実験条件 use utf8 しない(use utf8 はトラブルが多すぎてやってられないので)。 変換前も変換後も utf8 フラグは立っていないこと。 実験用データとして、42KBのテキストファイル(EUC-JP, 日本語半分ぐらい)を用意。 ソースはこんな感じです。引数に処理したい euc-jp のテキストファイル名を与えます。 use strict; use Benchmark; use Encode; use Encode::Guess qw(euc-jp shiftjis iso-2022-jp); my $euc = join('', <>); my $utf = $euc; Encode::from_to
ref:404 Blog Not Found:perl tips - Encodeを速く使う方法 当然の話だけど、対象の文字列が長くなると、Encode::encode も、$e->encode も大差ない。 ちょっといじって試してみる。 use strict; use warnings; use Benchmark qw/cmpthese timethese/; use utf8; use Encode; use Jcode; use Unicode::Japanese; use Smart::Comments; my $str = join '', ( 'a' .. 'z', ( map { chr } ord('ぁ') .. ord('ん') ) ); $str = $str x shift if @ARGV; my $bytes = encode_utf8($str); my $u
2007年04月23日01:30 カテゴリLightweight LanguagesTips perl tips - Encodeを速く使う方法 はっきり言ってこれはフェアではない。 みかログ: ErlangとPerlの速度比較 Perl側は,Encodeが遅い. Encode::from_toがinplaceでコンバートしてしまうために,直前に文字列コピーがあるのも影響しているのかも なぜなら、Encode::from_to()は速度ではなく、安全性に最適化しているから。 そもそもはじめからUTF-8、それもutf8フラグがたっている文字列にfrom_toを使うのはばかげている。 for(my $i = 0; $i < 0xffff; $i++) { my $str2 = $str; Encode::from_to($str2, "UTF-8", "Shift_JIS"); } は単に
しかし、 test.pl < utf8.txtは行けるが、 test.pl utf8.txtはだめ。 前にも書いたけど、引数を指定した場合、<> は STDIN じゃないですから当然ですね。とりあえず use open IN => ':utf8'; とするほうが、スマートといえばスマートか? や、Encode::decode を使うのが駄目ってことはないと思うけど。 追記 dankogai さんから Trackback が飛んできて気づいたのだが、書き方が分かりにくいな。ここでは、 use strict; use warnings; use utf8; use open IN => ':utf8'; binmode STDOUT, ':utf8'; while (<>) { print if /[ぁ-ん]/; } とするのではなくて、山下さんの元のプログラムに対して use open を追
PerlIO::gzip を使うと、 open my $fh, '<:gzip', $filename or die; で、gzip 圧縮されたファイルを直接扱える。これと open my $fh, '<:encoding(utf-8)', $filename or die; なエンコーディング指定を同時に指定するにはどうすれば良いかと聞かれたんだけども、そんなことをしたくなったことがなかった知らねー。 てことで、ちょっと試してみると。 open my $fh, '<:gzip:encoding(utf-8)', $filename or die; な感じでいいっぽい。:gzipと:encoding(utf-8)の間にはスペースが入っても良いみたいだけど。 で、ついでにPerlIO::viaを使えば PerlIO Layer に直接フィルタモジュールを挟みこめるということを、初めて知った。
-> 趣旨と注意書き -> UTF8フラグ? -> UTF8フラグとPerlIOレイヤ -> UTF8フラグのついた文字列を記述する -> Wide character in print ... -> Encode -> utf8::* -> use utf8; -> use encoding; -> use UTF8 と use encoding -> JcodeからEncodeへ -> 情報源 <- モドル 趣旨と注意書き Perl 5.8.x のUnicode 関連です。 正直、5.8.x は、ネタでしか使ってなかったので(ぉ、ちゃんといじったことがありませんでした。 使ってみると、よくわかんなくなったので、ちょっとまとめてみました。 今でもあんまりわかってないかもしれないので、内容は無保証です。 突っ込み歓迎。 Jcode、Encodeのメンテナの弾さんから、ご指摘いただいたので、
[Perl] Wide character in print atというエラーはUTF-8フラグが付いた文字列をprintしようとしているからである。なのでUTF-8フラグを取り外してからprintすればエラーがでなくなります。UTF-8フラグが付いているかどうかはutf8::is_utf8を使用すればよい。 #UTF8フラグが付いているかの確認 utf8::is_utf8では実際の文字列がUTF-8かどうかではなく、あくまでフラグがついているかどうかを確認します。そのため、UTF-8の文字列もフラグが付いていなければ上記の出力はno flagとなります。またutf8::is_utf8はuseしなくても使用できる。useすると全然違う意味あいになるので注意。 UTF-8フラグが付いていたら、encodeを使用してフラグをはずします。以下の例では$stringをutf-8に変換して出力します
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く