FAQ

今日も「社内」のどこかで東陽テクニカ2

PERFORCE

ID.066

Q. 国際化とローカライズ


Unicodeモードの構成、サポートされている文字セットの使用、非ASCIIデータの取り扱いについて

A.


概要

この記事では、Unicodeモードで動作させるためのPERFORCEサーバの構成方法、および異なる文字セットを操作するためのPERFORCEクラ イアントの構成方法を説明します。また、PERFORCEでマルチバイト文字(非ASCIIのデータ)を取り扱う際に起こりうる問題と、その解決策につい ても述べます。


詳細

PERFORCEにおいてマルチバイト文字のセットを取り扱う際、ユーザ要件によって、いくつかの方法があります。
通常のPERFORCEのファイルタイプ に、新しいファイルタイプ <utf16> が加わったことにより、PERFORCEサーバを非Unicodeモードで動作させたままで、<unicode>ファイルタイプのファイルを 安全に管理し続けられるようになりました。
ファイル名またはPERFORCEメタ データに非ASCII文字が含まれる場合、PERFORCE管理者は、以下に説明するようにPERFORCEサーバをUnicodeモードに切り換えてく ださい。Unicodeモードで動作させると、すべての非ファイルデータ(識別子、コメントなど)と共に、<unicode>ファイルタイプ のすべてのファイルの内容も、クライアントのP4CHARSET環境変数によって指定された文字セットとサーバのUTF8との間で、文字コード変換されま す。

Unicodeモードに切り替える前に、取り扱いたい文字セットがサポートされていることを確認してください。Unicode文字を含むファイルを管理で きるようにしたい場合、UTF8またはUTF16のどちらかのエンコードで標準化することを検討するとよいかもしれません。リリース2007.2からは、 PERFORCEでは特にUTF16ファイルについて非UnicodeモードおよびUnicodeモードの両方をサポートするように、新規にUTF16 ファイルタイプが追加されています(リリースノート参照)。UTF16対応の機能を利用するには、すべてのPERFORCEユーザはバージョン2007.2以上のPERFORCEクライアント・プログラムを稼動させる必要があります。

ユーザのディレクトリに保存されている文字を含むUnicodeファイルを操作する必要がある場合、単一のクライアント・マシンで同期またはサブミットを 実行すると、タスクを完了するために追加の手順(別の P4CHARSETS に切り替えたり、追加のコード・ページをインストールするなど)が必要となることがあるため、処理が複雑になる可能性があります。

日本語版 注: 日本語Windowsをクライアントホストとして日本語版 PERFORCEをお使いのお客様は、P4CHARSETを "shiftjis" に設定することによって、UTF8(サーバ)<==> Shift-JIS(クライアント)の文字コード変換を実現できます。
 
上記のオプションがユーザの状況では適切 でない場合、Unicodeファイルをバイナリファイルとして追加することができます。デフォルトではPERFORCEは「真の」バイナリファイルの比較 をサポートしていないため、これによってそのようなファイルを比較することが少し難しくなります。しかし、バイナリファイルが「真の」UTF8ファイルで あれば、P4Vのデフォルトの差分/マージ・ツールはそれらを正しく比較します。さらに、P4Win/P4Vのユーザはそのようなファイルに対して、サー ドパーティの差分/マージ・ツールを指定できます。同様に、コマンドラインのユーザは‘-t' オプションを使用して比較を強制的に行うことができます。

日本語版 注: 日本語版PERFORCEでは、たとえ「真の」UTF8ファイルであったとしても、PERFORCEのマージ・ツールP4Mergeはご利用になれない場合があります。ご注意ください。
 


PERFORCEサーバをUnicodeモードに切り換える

PERFORCEをそのような環境で使用する前に、まずサーバにUnicodeモードで動作するよう指示しなければなりません。このモードで動作するよう にサーバを設定するには、PERFORCEサーバをいったん停止させ、PERFORCEサーバルート・ディレクトリ上で次のコマンドを実行します。
p4d -xi
このコマンドは、既存のメタデータがすべて有効なUTF8であることを検証し、保護されたカウンタ"unicode"を設定して、p4dが今後実行される 際にUnicodeモードで動作するように指示します。このモードがサーバに設定されると、無効にすることはできません(すなわち、非Unicodeモー ドに戻ることはできません)。p4d -xi によってサーバをUnicodeモードに切り換えた後は、通常お使いのオプションでp4dを起動することができます。


重要事項:

時として、p4d -xi コマンドによりサーバをUnicodeモードに切り換えようとすると、サーバが以下の応答を返すことがあります。
Table db.user has 14 rows with invalid UTF8. Table db.domain has 1 rows with invalid UTF8. ... Perforce server error: Database has 14 tables with non-UTF8 text and can't be switched to Unicode mode.
これを解決するには、次のどちらかの操作を行います。
一つめの方法を示します。
  1. チェックポイントを作成します。
  2. 文字コードをUTF8に変換して、新しいチェックポイントを保存します。Windowsをご利用の場合はNotepad(2GBのサイズ制限があります)を使うか、もしくはサイズが2GBを超えるならば、UTF8で保存できる適当なエディタを使うことができます。ファイルの内容をUTF8で保存できるのであれば、(ワード・プロセッサは避けるべきですが、)エディタが何であるかは重要ではありません。UNIXをご利用の場合は、iconv コマンドの実行を検討することも可能です。
  3. すべての db.* ファイルを削除します。
  4. UTF8のチェックポイントからリストアを実行します。
  5. 検証します。
  6. あらためて、p4d -xi コマンドを試行します。


二つめの方法を示します。
  1. チェックポイントを作成します。
  2. それぞれのテーブル(チェックポイント内の列)において、high-ASCII文字をすべて見つけ出します。
  3. それらを修復します。
  4. 変更したチェックポイントを保存します。
  5. チェックポイントからリストアを実行します。
  6. あらためて、p4d -xi コマンドを試行します。


適切なUTF8に変換するには、利用可能な何らかの文字セット変換ツールを使用することもできます。"iconv" ツール/コンバータは、UNIXとWindowsの両OSで利用でき、適切な選択です。ただし、"iconv" を使ったとき、ドイツ語のウムラウト文字が欠落する場合がありますので、実行後には p4 verify による検証を行う必要があります。


ユーザへの注意事項

PERFORCEをUnicode環境で使用するには、クライアント・マシン上にP4CHARSET環境変数を設定しなければなりません。設定していないと、P4VまたはP4SCC.DLLを使用しているユーザの場合はUnicodeが有効であるサーバへの最初の接続時にエンコーディングを選択するよう要求され、それ以外のユーザの場合は "Unicode server permits only unicode enabled clients"(UnicodeサーバにはUnicodeが有効にされたクライアントのみ使用できます)というメッセージが表示されます。


重要事項:

同一コンピュータ上に異なるエンコーディングを混在させることによって結果的にP4CHARSET設定が混在すると、変換に伴う問題が生じる可能性が高いことに注意してください。

以下の表に、(米国において)最もよく使用されるP4CHARSETの値をいくつか示します。
言語 プラットフォーム Windows
コードページ
Unix
ロケール
P4CHARSET
の設定
English/High-ASCII Windows 1252 n/a winansi
English/High-ASCII UNIX/Linux n/a 各種 iso8859-1/utf8
English/High-ASCII MAC OS X n/a n/a utf8
すべて/未翻訳 すべて n/a n/a utf8*
すべて すべて n/a n/a utf16**


P4CHARSETの値の一つに、"none" があります。グローバル・オプション "-C" で設定すれば、既に設定されているP4CHARSET値をオーバライドし、UnicodeモードのPERFORCEサーバに接続できます。サポートされているP4CHARSET値の完全なリストを見るには、'p4 help charset'を実行するか、Perforce 国際語モードに関する注意事項をご参照ください。

* utf8は翻訳されませんが、ファイルの内容は検証されます。

** utf16では、p4 コマンドライン・クライアントが機能するためには、P4COMMANDCHARSET が異なる文字セット(非utf16)に設定されている必要があります。
p4 -C utf16 -Q utf8 sync some_files
ただし、"-C"はP4CHARSETに対するコマンドライン・オプションであり、"-Q"はP4COMMANDCHARSETに対するコマンドライン・オプションです。

P4VおよびP4WINには、[プリファレンス]ダイアログ内にP4CHARSETをリセットするためのフィールドがあります。


Windows環境でのP4CHARSETの設定:
  1. Windowsにログインし、MS-DOSコマンド・プロンプトを開きます。
  2. True Type(TT)フォントまたはOpen Typeフォントがあることを確認します。
  3. "chcp"コマンドを発行することによって、Windowsマシン上のアクティブ・コード・ページを表示します。Windowsは以下のようなメッセージを表示します。
  Active code page: 1252
アクティブ・コード・ページに基づいて文字セットを以下のように選択します。
 
コード・ページ P4CHARSETの設定
1252 winansi
932 shiftjis

このワークステーション上のすべてのユーザにP4CHARSETを設定するには、管理者権限が必要です。その場合、以下のコマンドを発行します。
p4 set -s P4CHARSET=[character_set]
管理者権限を持っていない場合、以下のコマンドを使用できます。
p4 set P4CHARSET=[character_set]
これで、現在ログインしているユーザにP4CHARSETが設定されます。同じマシン上の他のユーザは個別にP4CHARSETを設定しなければなりません。



UNIX環境でのP4CHARSETの設定:

コマンド・シェルまたは .kshrc、.cshrc、.profile などの起動スクリプトにより、P4CHARSETを適切な値に設定します。環境変数 LANG または LOCALE の現在の設定を調べることによって、P4CHARSETに対する適切な値を決定することができます。
$LANG の値の例 P4CHARSETの設定
en_US.UTF-8 utf8
ja_JP.EUC eucjp
ja_JP.PCK shiftjis


MAC環境でのP4CHARSETの設定:

例えば、次のようにコマンド・シェルでP4CHARSETを適切な値に設定するか、
export P4CHARSET=utf8
もしくは、~/.MacOSX ディレクトリにある "environment.plist" の中でこれを設定します。

前者の方法では、実行中のシェル・セッション内でしか設定が有効にならないことに注意してください。恒久的に設定するためには、ユーザの起動スクリプトか environment.plist ファイルの中で設定する必要があります。デフォルトのシェルがbashの場合、起動スクリプトは ~/.bashrc です。

P4CHARSETが環境に設定されていない場合、P4Vユーザは最初にUnicodeサーバに接続する際に、ドロップダウン・リストから設定を選択するよう要求されます。


サーバがUnicodeモードかどうかの確認

Unicodeモードのサーバに対してコマンドを実行すると、次のようにエラーが返ってくる場合があります。
$ p4 counters Unicode server permits only unicode enabled clients. (Unicodeサーバに接続できるのは、Unicodeモードクライアントのみである。)
クライアントもUnicodeモードであれば、p4 counters の実行結果には、'unicode'カウンタが表示され、その値は '1' となります。

例: $p4 counters change = 1 unicode = 1 upgrade = 21
クライアント側でP4CHARSETを設定していないために、p4 counters が実行できない場合、タグ付きの p4 info を実行することができます。p4 -Ztag info によって出力されるタグ付き情報には、enabled という値を持つunicodeフィールドが含まれます。

例: $ p4 -Ztag info [...] ... clientAddress 127.0.0.1:50936 ... unicode enabled ... serverAddress localhost:9988 ... serverRoot introot/ ... serverDate 2010/10/21 11:36:37 -0700 PDT ... serverUptime 02:46:52 ... caseHandling sensitive

Unicodeモードで動作させる際に起こりうる問題

「Cannot translate(翻訳できない)」とのエラー・メッセージ

このメッセージは、PERFORCEサーバによってクライアント・マシンに送られる文字を含まない文字セットによりクライアント・マシンが構成されている場合に表示されます。
クライアント・マシンはマッピングされていない文字を表示できません。

例えば、クライアント・マシンがshift-JIS 文字セットを使用するよう構成されており、ディポにはShift-JISにマッピングされていない日本語EUC文字セットに属する文字を名前にもつファイルがある場合、それらのファイルを一覧表示する p4 files コマンドまたは p4 changes コマンドを実行すると「~を翻訳できません」というエラー・メッセージが表示されます。


UnicodeのPERFORCE識別子に対する長さの制限

PERFORCE サーバでは、ジョブのコメントの索引付け、ファイル名の指定、ビュー・マッピングの制御、およびクライアント名やラベル名などのオブジェクトの識別に使用される文字列の長さに対し、内部的な制限があります。

最も一般的な制限値は1024バイトです。いくつかのUnicode文字は2バイト以上に拡張されることがあるため、ある種のUnicodeエントリがPERFORCE内部の制限を越える可能性があります。

基本的なUnicode文字は3バイトを超えて拡張されないため、PERFORCE内部の制限値を3で割れば、Unicodeシーケンスが制限を超えないようにすることができます。

また、UnicodeシーケンスがPERFORCEの制限を超えないようにするために、341文字を超えるUnicodeでクライアント名またはビュー・パターンを作成しないでください。

正常な使用状況では、これが大きな制約となることはないはずです。


非Unicodeサーバで"unicode"ファイルタイプを使用する際に起こりうる問題

国際語モードで動作していないサーバでは、PERFORCEの"unicode"ファイルタイプの動作が大きく異なります。クライアントとサーバは共に、ファイルが有効なUTF8であると見なし、有効なUTF8としてファイルを保存します。何らかの方法によって内容の翻訳や検証を試みることはありません。したがって、ファイルをUTF8として保存可能であるエディタを使用して保存しなければなりません。この条件を除き、ユーザは通常どおりPERFORCEサーバにアクセスできます。クライアントでP4CHARSETを設定する必要はありません。


改行が正しく保存されない件

ファイルは、ユーザによって、UTF8ではなくUTF16でチェックインされています。古いリビジョンにロールバックするか、ファイルをUTF8として保存し直してください。

<< PERFORCEに関するFAQ一覧へ戻る