2011-02-13 103 views
3

我正在寫一個AppleScript的來解析的iOS本地化文件(/en.lproj/Localizable.strings),翻譯值和輸出的翻譯(/fr.lproj/Localizable.strings)到磁盤UTF-16(Unicode)編碼。如何使用AppleScript創建和編寫UTF-16文本文件?

出於某種原因,生成的文件在每個字母之間都有一個額外的空格。在進行了一些挖掘之後,我在「瞭解AppleScript:腳本綜合指南」中找到了問題的原因。

「如果你不小心讀了UTF-16文件 爲的MacRoman,結果值可以 外觀乍一看像一個普通的 字符串,尤其是如果它包含 英文文本,你很快就會發現 那但當您嘗試使用 時,出現以下錯誤: 症狀是您的「字符串」中的每個可見字符 在它前面似乎都有一個不可見字符 例如,讀取UTF-16編碼 包含短語「你好」的文本文件3210 World!「作爲一個字符串產生一個字符串 ,比如」H l l l o W o r l d! 「,其中每個」 「實際上是一個不可見的ASCII 0字符。」

因此,例如,我的英語本地化字符串文件有:

"Yes" = "Yes"; 

而產生的法語本地化字符串文件:

" Y e s " = " O u i " ; 

這是我CREATEFILE方法:

on createFile(fileFolder, fileName) 
    tell application "Finder" 
     if (exists file fileName of folder fileFolder) then 
      set the fileAccess to open for access file fileName of folder fileFolder with write permission 
      set eof of fileAccess to 0 
      write ((ASCII character 254) & (ASCII character 255)) to fileAccess starting at 0 
      --write «data rdatFEFF» to fileAccess starting at 0 
      close access the fileAccess 
     else 
      set the filePath to make new file at fileFolder with properties {name:fileName} 
      set the fileAccess to open for access file fileName of folder fileFolder with write permission 
      write ((ASCII character 254) & (ASCII character 255)) to fileAccess starting at 0 
      --write «data rdatFEFF» to fileAccess starting at 0 
      close access the fileAccess 
     end if 
     return file fileName of folder fileFolder as text 
    end tell 
end createFile 

這裏是我的WriteFile的方法:

on writeFile(filePath, newLine) 
    tell application "Finder" 
     try 
      set targetFileAccess to open for access file filePath with write permission 
      write newLine to targetFileAccess as Unicode text starting at eof 
      close access the targetFileAccess 
      return true 
     on error 
      try 
       close access file filePath 
      end try 
      return false 
     end try 
    end tell 
end writeFile 

任何想法,我做錯了嗎?

+0

我認爲手動翻譯這將花費更少的時間比寫這個AppleScript甚至不工作。 :') – 2011-02-13 00:49:09

+0

Radek,超過150多個短語需要翻譯成10多種語言...... – 2011-02-13 01:02:18

回答

0

下面是我用來讀寫UTF16的處理程序。您不需要單獨的「創建文件」處理程序。如果文件不存在,寫入處理程序將創建該文件。將「appendText」變量設置爲true或false。 False表示覆蓋文件,true表示將新文本添加到文件中當前文本的末尾。我希望這有幫助。

on writeTo_UTF16(targetFile, theText, appendText) 
    try 
     set targetFile to targetFile as text 
     set openFile to open for access file targetFile with write permission 
     if appendText is false then 
      set eof of openFile to 0 
      write (ASCII character 254) & (ASCII character 255) to openFile starting at eof -- UTF-16 BOM 
     else 
      tell application "Finder" to set fileExists to exists file targetFile 
      if fileExists is false then 
       set eof of openFile to 0 
       write (ASCII character 254) & (ASCII character 255) to openFile starting at eof -- UTF-16 BOM 
      end if 
     end if 
     write theText to openFile starting at eof as Unicode text 
     close access openFile 
     return true 
    on error theError 
     try 
      close access file targetFile 
     end try 
     return theError 
    end try 
end writeTo_UTF16 

on readFrom_UTF16(targetFile) 
    try 
     set targetFile to targetFile as text 
     targetFile as alias -- if file doesn't exist then you get an error 
     set openFile to open for access file targetFile 
     set theText to read openFile as Unicode text 
     close access openFile 
     return theText 
    on error 
     try 
      close access file targetFile 
     end try 
     return false 
    end try 
end readFrom_UTF16 
0

如果您收到的每一個字符之間的實際空間,你可能已經拿到了「(字符我通someText的j)的爲字符串」在你的代碼的反模式[1]。這將把一個字符串分割成一個字符列表,然後將它強制回到一個字符串中,並在每個字符之間插入當前的文本項分隔符。正確的(即快速和安全的)獲取子字符串的方法是:'通過某些文本的文本'(p179-181)。

OTOH,如果你得到隱形字符之間的每個字符[2],那麼是的,這將是一個編碼問題,通常使用MacRoman或其他單字節編碼讀取UTF16編碼文件。如果你的文件有一個有效的Byte Order Mark,那麼任何Unicode精通的文本編輯器都應該使用正確的編碼來讀取它。


[1] p179指出,這個習語是不安全的,但忘了提供它引起的問題的實際演示。 [3]

[2] IIRC在p501上的例子是爲了使用矩形符號來表示不可見的字符,即「⃞H⃞e⃞l⃞l⃞o」而不是「H ello」,但沒有完全出現,所以可能被誤讀爲意味着可見空間。 [3]

[3]隨意向Apress提交勘誤表。