文字エンコーディング

3ds Max 2013 以降では、テキスト ファイルでの多言語文字サポート機能が追加されています。

変更点の大半はユーザが気付くことがないのに対し、この新機能のいくつかの面は、MAXScript ファイルに影響を及ぼすか、または拡張されたユーザ コントロールの MAX Script に公開されます。

次のトピックでは、さまざまなエンコーディング標準について説明し、影響を受ける機能を示します。

   

文字エンコーディングの概要

初期のコンピュータでは、テキスト ファイルのエンコーディングに ASCII (American Standard Code for Information Interchange)仕様が使用されました。元々 ASCII では 7 ビット エンコーディングを使用し、英語のアルファベット、0 から 9 の数字、および句読点文字のみを表していました。

その後 ASCII は 8 ビットに拡張され、テーブルの上半分(127 より上の ASCII コード)に国際文字と特殊文字が追加されました。一度に有効にできた追加文字は 128 個に限られたため、たとえばキリル語とドイツ語の文字に同時に対応することは不可能でした。Microsoft Windows で使用されている拡張 ASCII は、Windows-1252 または ANSI エンコーディングとして知られています。

この問題を解決し、それぞれの文字を固有のコードで保存できるようにするため、Unicode 標準が 90 年代初めに採用されました。さまざまな Unicode ベースのエンコーディングに Unicode 標準が実装されています。たとえば、UTF-8、UTF-16、UTF-32/UCS-4 などがあります。これらはすべて 8 ビット エンコーディングの限界を克服しており、地球上のほとんどすべての言語に対応できます。特に UTF-8 は、World Wide Web の世界で優勢なUnicode エンコーディング仕様です。

UTF-8

UTF とは「UCS Transformation Format」の略であり、 UCS とは 「Universal Character Set」の略です。UCS国際 ISO/IEC 標準 のことです。

UTF-8 は可変長幅のエンコーディング方式で、1 ~ 4 バイト(1 バイトは 8 ビット、Unicode 標準ではオクテットと呼ぶ)を使用して Unicode 文字セットの固有文字 1,112,064 個それぞれを表します。

コードの数値が小さく、実際に使用されることが多い文字は少ないバイト数でエンコードされるため、いくらか効率がよくなります。

特に、Unicode 文字セットの最初の 128 文字は ASCII 文字セットに 1 対 1 で対応しており、UTF-8 でも 1 バイトでそれらの文字をエンコードしています。これにより ASCII テキストも、UTF-8 でエンコードされた有効な Unicode テキストとなります。

このエンコーディングにおける副作用は、一部の外国語で文字を表すのに必要なバイト数が多くなることです。たとえば、キリル文字とギリシャ文字ではほとんどの場合に 2 バイトが必要になり、その他の言語では 3 ないし 4 バイトが必要になることもあります。こうして、テキスト ファイルのサイズは大きくなります。

UTF-16

UTF-16 はエンコード可能な文字数に関しては UTF-8 と似ていますが、8 ビットのバイト 4 個の代わりに 16 ビットのバイト 2 個を使用して Unicode 文字セットをエンコードします。

Windows API では ANSIUTF-16 のみをサポートするため、3ds Max 2013 では内部で UTF-16 を使用して Unicode 文字を表します。これには、シーン ファイル内部のテキスト ストリームや、INI ファイルの保存およびロードなどが含まれます。

BOM (Byte-Order Mark)

一部の Windows プログラムには、UTF-8 ファイルの先頭に、0xEF、0xBB、0xBF のバイトが追加されています。これは Unicode Byte-Order Mark の UTF-8 エンコーディングであり、実際のバイト順序と関係はありませんが、一般に UTF-8 BOM と呼ばれます。最近のテキスト エディタはこれらのバイトを取り除きますが、以前のプログラムの中には取り除かないものもあります。

他のプログラムとの互換性が重要ではない場合は、BOM バイトを使用して、ファイルが ASCII エンコーディングではなく UTF-8 エンコーディングであることを識別できます。たとえば、BOM を含めて .MS ファイルを保存することにより、3ds Max 2012 以前のバージョンでは、国際文字を失うことなくスクリプトを開くことができます。

一般に、他のソフトウェアとの互換性問題が関係しない場合は、UTF-8 BOM を使用せず、エンコーディングの選択をプログラムに任せる(ファイルが有効な UTF-8 かどうかをチェックする)ようお勧めします。

   

3ds Max での既定文字エンコーディング

シーン以外のファイルの既定の文字エンコーディングは、[カスタマイズ](Customize) > [基本設定](Preferences) > [ファイル タブ](File tab) > [読み込みオプション](File String Data Handling)のコントロール グループで設定します。

シーン ファイルに指定された言語データを上書き(Override language data specified in scene file)

オフにすると、.MAX シーン ファイルに保存されている言語データが優先されます。

オンにすると、その言語データが上書きされます。

UTF8 を使用して従来の非シーン ファイルに文字列を保存(Save strings in legacy non-scene files using UTF8)

オフにすると、テキスト ファイルが ASCII として保存され、互換性が保たれます。

オンにすると、テキスト ファイルは UTF-8 (BOM 付き) エンコーディングを使用して保存されます。

   

文字エンコーディングと MAXScript

MAXScript Editor とスクリプト ファイル

異なる文字エンコーディングを使用してテキスト ファイルを書き込む 3ds Max の機能の影響を最も受けるのは、3ds Max 2008 で導入された MAXScript Tabbed Editor (別名 MAXScript Pro Editor) です。

3ds Max 2013 には、MAXScript Editor の[ファイルを保存...](Save File...)ダイアログ ボックスのドロップダウン リストから選択することにより、保存されているスクリプト ファイルのエンコーディングをコントロールする機能が追加されています。

新規ファイルの場合、ドロップダウン リストの既定の設定は既定のコード ページ(Default Code Page)です。

既存ファイルの場合、ドロップダウン リストの設定はファイルのエンコーディングに応じて異なるため、明示的に変更しない限り、再保存の際にエンコーディングも保持されます。

既定のコード ページ(Default Code Page)を保存するときの 3ds Max の既定の動作では、UTF-8 (BOM 付き) を使用しません。この動作は、[基本設定](Preferences)ダイアログ ボックス(前のセクションを参照)で変更して、強制的に UTF-8 (BOM 付き) として保存できます。

   

3ds Max 2013 以前のバージョンの場合、MAXScript Editor はスクリプト ファイルを暗黙的に UTF-8 BOM として保存しました。

また、3ds Max の旧バージョンのエディタは UTF-8 (BOM 付き) ファイルを正しくロードしましたが、Unicode、Unicode BigEndian、BOM なしの UTF-8 など、対応していないエンコーディングもあります。

そのため、旧バージョンの 3ds Max で保存されたスクリプト ファイルは 3ds Max 2013 およびそれ以降で正しくロードされますが、3ds Max 2013 またはそれ以降で保存されたファイルでは、UTF-8 (BOM 付き) として保存された場合にのみ、国際文字が正しくロードされます。それ以外の場合、国際文字は ? 記号で置き換えられます。

次のスクリプトには、英語、ドイツ語、およびブルガリア語の 3 言語で 3 つの文字列定義が含まれています。

3ds Max 2013 またはそれ以降の MAXScript Editor にテキストを入力した後、スクリプトは、既定のコード ページ(Default Code Page)、Unicode、Unicode BigEndian、UTF-8 BOM、および UTF-8 として保存されました。

サポートされているすべてのエンコーディング標準を使用してテキストが保存された後、結果のスクリプト ファイルが 3ds Max 2013 の MAXScript Editor で再び開かれました。

図に示されるように、既定のコード ページ(Default Code Page)を除くすべてのファイルで、元の多言語内容が正しく再表示されています。

   

今度は、3ds Max 2012 の MAXScript Editor で同じファイルをロードした場合を見てみます。

図に示されるように、UTF-8 BOM エンコーディングのみが正しく変換されました。UTF-8 にはドイツ語文字が含まれていますが、ブルガリア語のテキストは完全になくなっています。Unicode はまったく認識されていません。

   

UTF-8 BOM でエンコードされたファイルを 3ds Max 2012 で再保存すると、3ds Max 2013 で正しく表示されるのがわかります。

   

エンコーディングとユーザ インタフェース テキスト

3 つの編集テキスト コントロールがあるテスト ロールアウトを作成し、3 つの文字列それぞれをテキスト フィールドに入力すると、3ds Max 2013 では正しいエンコーディングが生成されますが、3ds Max 2012 では生成されません。

言い換えると、旧バージョンの 3ds Max の MAXScript Editor では UTF-8 BOM でエンコードされたファイルを読み取ることができますが、3ds Max 自体は国際文字を正しく表示できませんでした。

3ds Max 2013 以降は、アプリケーション全体で Unicode を認識できるようになり、国際文字も正しく表示されるようになります。

   

FileStream テキスト ファイルの入出力

FileStream のメソッドを使用したテキスト ファイルの保存およびロードでは、現在の文字エンコーディング設定をサポートすることになります。

たとえば、[基本設定](Preferences)ダイアログ ボックスが UTF-8 へのエンコーディングを上書きしないように設定されている場合は、次のスクリプトを使用すると、国際文字が欠落したテキスト ファイルが生成されます。

例:

theString1 = "This is some English text."
theString2 = "Das wäre auf Deutsch, so daß man die Unterschiede sehen könnte..."
theString3 = "Най-сетне повод да вмъкна малко Български в документацията!"

theFileName = (GetDir #temp + "\\testencoding.txt")
theFile = createFile theFileName
format "%\n" theString1 to:theFile
format "%\n" theString2 to:theFile
format "%\n" theString3 to:theFile
close theFile
edit theFileName

[基本設定](Preferences)を[UTF8 を使用して従来の非シーン ファイルに文字列を保存](Save strings in legacy non-scene files using UTF8)に切り替えると、ファイルが UTF-8 として保存され、ブルガリア語のテキストが正しく保存およびロードされます。

   

INI ファイルの保存とロード

setIniSetting() メソッドでは、3ds Max の[基本設定](Preferences)に依存せず、独自の既定の設定を使用します。

既定で setIniSetting() は、UTF-16 エンコーディングに設定されます。

setIniForceUTF16Default() メソッドでは、エンコーディングの一時的な既定値を設定できます(現在の 3ds Max セッションでのみ有効)。

ユーザは、オプションのキーワード引数 forceUTF16: を使用して明示的にエンコーディングを指定できます。

詳細については、 setINISetting() のドキュメントを参照してください。

   

MemStreamMgr 解析

MemStreamMgr.openFile() メソッドでは、2 つのオプション キーワード引数を使用してエンコーディングとコード ページをコントロールできるようになりました。