5

私の「ViewController.swift」には、ローカライズされた文字列があります。

TheOutLabel.text = NSLocalizedString("hello", comment: "The \"hello\" word")

ターミナルで、「Localizable.strings」ファイルを生成するために、次のように入力しました。

cd Base.lproj/; genstrings ../*.swift; cat Localizable.strings

そして次の結果を得ました:

??/* The \"hello\" word */
"hello" = "hello";

と入力するod -c Localizable.stringsと、次のようになります。

0000000  377 376   /  \0   *  \0      \0   T  \0   h  \0   e  \0      \0
0000020    \  \0   "  \0   h  \0   e  \0   l  \0   l  \0   o  \0   \  \0
0000040    "  \0      \0   w  \0   o  \0   r  \0   d  \0      \0   *  \0
0000060    /  \0  \n  \0   "  \0   h  \0   e  \0   l  \0   l  \0   o  \0
0000100    "  \0      \0   =  \0      \0   "  \0   h  \0   e  \0   l  \0
0000120    l  \0   o  \0   "  \0   ;  \0  \n  \0  \n  \0                

と入力file Localizable.stringsすると、次のように表示されます。

Localizable.strings: Little-endian UTF-16 Unicode c program text

「emacs」でファイルを開くと、これらの文字が表示されず、入力すると次のように表示さM-x describe-current-coding-system RETれます。

Coding system for saving this buffer:
  U -- utf-16le-with-signature-unix (alias: utf-16-le-unix)

したがって、ファイルの先頭にあるこれらの 8 進文字 \377 および \376 は、一種の utf-16-le BOM のように見えます。これは、各文字の後に \0 が続く理由を説明しています (UTF-16 は、この場合はUTF-8)。

これは正常/有用/有害ですか?

また、標準の *nix ツール ( grepsedawk) は utf-16 ファイルを適切に処理しません。

grep '=' Localizable.strings 
Binary file Localizable.strings matches

grep -a '=' Localizable.strings | sed -e 's/ = //'
"hello" = "hello";

また、 Localizable.strings を編集して に置き換え"hello";ました"Hello";。それから、「SourceTree」(私の「git」クライアント) は、私がしない限り違いを表示できません:

echo '*.strings diff=localizablestrings' > .../.git/../.gitattributes
echo '[diff "localizablestrings"]' >> .../.git/config
echo '  textconv = "iconv -f utf-16 -t utf-8"' >> .../.git/config

Apple のInternationalization and Localization Guide には次のように書かれています。

注: Localizable.strings ファイルが Unicode (UtF-16) であると Xcode が警告する場合は、ファイル インスペクタを使用して Unicode (UTF-8) に変換できます。

では、BOM を削除/無視する必要がありますか?

genstringsUTF-8 ファイルを生成するオプションはないようです。

ファイルを変換する必要がありますか?

4

1 に答える 1

0

このgenstringsツールは、「UTF-16LE with BOM」エンコーディングで文字列ファイルを出力するようにハードコードされています。私は文字列ファイルを UTF-8 で保持することを好み、次のシェル スクリプトを使用してそれらを生成します。

#!/bin/zsh
function convert {
    for file in $@; do
        print "Converting $file to UTF-8"
        iconv -f utf-16 -t utf-8 $file > temp   
        rm $file; mv temp $file
    done
}
genstrings -o en.lproj *.m
convert en.lproj/*.strings
于 2021-09-14T08:24:30.603 に答える