2017-03-09 4 views
1

J'ai beaucoup de fichiers XML nommés en japonais. J'utilise Lua pour les lire et mettre les informations nécessaires dans les tableaux. Je pourrais ouvrir des fichiers nommés seulement dans un seul kanji comme 名 .xml, mais pour plusieurs kanjis comme 名 前 .xml c'était contrawise. Avant de lancer le fichier Lua, j'ai défini la page de code de la ligne de commande sur 65001 (sous la forme UTF-8). Et pour lire les fichiers j'ai besoin d'encoder le nom de fichier en utilisant la bibliothèque WinAPI de ACP (page de code ASCII?) À UTF-8, mais cet encodage ne fonctionne que pour les kanjis simples. J'ai essayé plusieurs suggestions sur Internet, en utilisant un chemin court vers le fichier, etc., mais aucun d'entre eux n'a fonctionné. J'ai essayé d'utiliser le court chemin en exécutant Lua en tant qu'administrateur - comme indiqué dans d'autres questions similaires, vous avez besoin d'administrateurs pour utiliser le raccourci - mais pas de chance.Ouverture des fichiers nommés en japonais dans Lua

... 
for fn in io.popen("DIR xml /B /AA"):lines() do 
    ... 
    local f = assert(io.open("xml\\" .. winapi.encode(winapi.CP_UTF8, winapi.CP_ACP, fn), "rb")) 
    ... 
end 
... 

Mais mon code produit erreur "Argument non valide". J'ai cherché cette erreur mais aucune d'entre elles n'est liée à Lua, donc j'ai ouvert le C/C++, mais ce que j'ai obtenu était seulement 'utiliser _wfopen' ou quelque chose comme ça. Ce n'est pas implémenté dans Lua et je ne veux pas non plus l'implémenter moi-même. Donc, quelqu'un a une idée de comment résoudre ce problème? Pour plus d'informations, assurez-vous de me le faire savoir. Merci!

+0

Que renvoie 'winapi.encode()'? S'il vous plaît montrer la sortie de 'print (fn: byte (1, -1)); print (winapi.encode (winapi.CP_UTF8, winapi.CP_ACP, fn): octet (1, -1)) 'pour un nom de fichier court (par exemple," 名 前 .xml ") –

+0

Et quelle est votre ACP (page de codes ansi) ? Vous pouvez l'afficher dans le registre Windows 'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Contrôle \ Nls \ CodePage \ ACP' –

+0

@EgorSkriptunoff De UTF-8:' 229 144 141 229 137 141 46 120 109 108' à ACP: '150 188 145 79 46 120 109 108' et mon ACP est 932. – Ortimh

Répondre

2

Je ne sais pas pourquoi votre programme ne fonctionne pas, mais essayez cette solution de contournement:

local pipe = io.popen([[for %G in (xml\*) do @(type "%G" & echo @FILENAMEMARKER#%G)]], "rb") 
local all_files = pipe:read"*a" 
pipe:close() 
for filecontent, filename in all_files:gmatch"(.-)@FILENAMEMARKER#(.-)\r?\n" do 
    -- process your file here 
    print('===== This is your file name:') 
    print(filename) 
    print('== This is your file content:') 
    print(filecontent) 
    print('== End of file') 
end 
+0

Merci pour cette solution de contournement! Cela me donne le contenu dont j'ai besoin. :) – Ortimh

0

Je pense que vous pouvez utiliser l'alphabet japonais dans une table comme

local jaAlphbet={"一","|","丶","ノ","乙","亅","<","二","亠","人","⺅","","儿","入","ハ","丷","冂","冖","冫","几","凵","刀","⺉","力","勹","匕","匚","十","卜","卩","厂","厶","又","マ","九","ユ","乃","","⻌","口","囗","土","士","夂","夕","大","女","子","宀","寸","小","⺌","尢","尸","屮","山","川","巛","工","已","巾","干","幺","广","廴,"廾","弋","弓","ヨ","彑","彡","彳","⺖","⺘","⺡","⺨","⺾","⻏","⻖","也","亡","及","久","⺹","心","戈","戸","手","支","攵","文","斗","斤","方","无","日","曰","月","木","欠","止","歹","殳","比","毛","氏","气","水","火","⺣","爪","父","爻","爿","片","牛","犬","⺭","王","元","井","勿","尤","五","屯","巴","毋","玄","瓦","甘","生","用","田","疋","疒","癶","白","皮","皿","目","矛","矢","石","示","禸","禾","穴","立","⻂","世","巨","冊","母","⺲","牙","瓜","竹","米","糸","缶","羊","羽","而","耒","耳","聿","肉","自","至","臼","舌","舟","艮","色","虍","虫","血","行","衣","西","臣","見","角","言","谷","豆","豕","豸","貝","赤","走","足","身","車","辛","辰","酉","釆","里","舛","麦","金","長","門","隶","隹","雨","青","非","奄","岡","免","斉","面","革","韭","音","頁","風","飛","食","首","香","品","馬","骨","高","髟","鬥","鬯","鬲","鬼","竜","韋","魚","鳥","鹵","鹿","麻","亀","啇","黄","黒","黍","黹","無","歯","黽","鼎","鼓","鼠","鼻","齊","龠"} 
print(jaAlphbet[1])--and you can call the letters, letter by letter 

désolé mais c'est Tout ce que je sais sur le sujet dont vous parlez, mais j'espère que cela aide