7

これまで、私が作業しているプロジェクトでは、ソースコードでのみASCIIを使用していました。utf8I18N領域での今後のいくつかの変更と、テストでいくつかのUnicode文字列が必要なため、プラグマを使用しながら、弾丸を噛んでソースコードをUTF-8に移動することを検討しています( use utf8;

現在、コードはASCIIであるため、コード自体に問題はないと思います。ただし、環境(perl5.8.8、Apache2、mod_perl、FreeTDSドライバーを備えたMSSQL Server)を考慮すると、発生する可能性のある副作用についてはよくわかりません。

過去にそのような移行を行ったことがある場合:どのような問題が予想されますか?どうすればそれらを管理できますか?

4

2 に答える 2

11

utf8プラグマは、ソースコードがUTF-8でエンコードされていることをPerlに通知するだけです。ソースでASCIIのみを使用した場合、Perlがソースコードを理解することに問題はありません。安全のために、ソース管理にブランチを作成することをお勧めします。:)

ファイルからのUTF-8データを処理する必要がある場合、またはUTF-8をファイルに書き込む必要がある場合は、ファイルハンドルにエンコードを設定し、外部ビットが期待するとおりにデータをエンコードする必要があります。たとえば、utf8でエンコードされたPerlスクリプトを使用して、GB2312としてエンコードされたファイル名を開くことができますか?を参照してください。

Unicodeについて説明しているPerlのドキュメントを確認してください。

JuerdのPerlUnicodeアドバイスも参照してください。

于 2009-11-25T13:42:50.513 に答える
4

数年前、社内のmod_perlプラットフォーム(〜35k LOC)をUTF-8に移動しました。これが私たちが考慮/変更しなければならなかったことです:

  • 「必要な場合にのみ」というperldocのアドバイスにもかかわらず、「useutf8;」を使用してください。すべてのソースファイルで-一貫性が得られます。
  • データベースをUTF-8に変換し、DB構成が接続文字セットをUTF-8に設定していることを確認します(MySQLでは、これを行うときはVARCHARのフィールド長の問題に注意してください)
  • DBIの最新バージョンを使用します-古いバージョンでは、返されたスカラーにutf8フラグが正しく設定されません
  • Encodeモジュールを使用し、処理しているデータを正確に把握していない限り、perlに組み込まれているutf8関数の使用は避けてください。
  • UTF-8ファイルを読み取るときは、レイヤーを指定します-open($fh,"<:utf8",$filename)
  • RedHatスタイルのOS(2008リリースでも)では、含まれているライブラリはutf8スカラーに格納されているXMLファイルの読み取りを好みません-perlをアップグレードするか、:rawレイヤーを使用するだけです
  • 古いperls(5.8.xバージョンでも)では、一部の古い文字列関数は予測できない可能性があります。$b=substr(lc($utf8string),0,2048)ランダムに失敗しますが、機能し$a=lc($utf8string);$b=substr($a,0,2048)ます!
  • 入力を変換することを忘れないでください-例:Webアプリでは、受信フォームデータのデコードが必要になる場合があります
  • すべての開発スタッフが、エンコード/デコードという用語がどのようになっているのかを知っていることを確認してください-perlの「utf8文字列」は/ de /コード化された形式であり、utf8データを含む生のバイト文字列は/en/コード化されています
  • URLを適切に処理します-/en/-utf8文字列をバイトにコード化し、%xxエンコードを実行してURLのASCII形式を生成し、/ de /-mod_perlから読み取るときにコード化します(例$uri=utf_decode($r->uri())
  • Webアプリの場合はもう1つ、HTTPヘッダーの文字セットがで指定された文字セットをオーバーライドすることを覚えておいてください<meta>
  • これは言うまでもありません-バイト演算(パケットデータ、ビット演算、MIME Con​​tent-Lengthヘッダーなど)を行う場合は、charではなくbytesで計算していることを確認してください
  • 特定のファイルにBOMがない場合でも、開発者がテキストエディタがUTF-8に設定されていることを確認する方法を知っていることを確認してください
  • リビジョン管理システム(グーグルの利益のために-subversion / svn)がファイルを正しく処理することを確認することを忘れないでください
  • 可能な場合は、ファイル名と変数名をASCIIに固執します。これにより、コードを移動したり、さまざまな開発ツールを使用したりする際の移植性の問題を回避できます。

もう1つ-これが黄金律です-それが機能するまでハックするだけでなく、特定のエンコード/デコードの状況で何が起こっているのかを完全に理解していることを確認してください!

あなたはすでにこれらのほとんどを整理していると確信していますが、うまくいけば、私たちが経験した何時間ものデバッグを回避するのに役立つすべてのものがあります。

于 2009-11-27T23:49:19.897 に答える