2017-09-20 10 views
3

のUnicodeパスを開くためにio.open使用することができます私のコードです:は、どのように私はここにLUA

local path = "C:/Users/KayWang/Desktop/测试.txt" 
local file,err = io.open(path,"rb") 
print(file,err) 

、これが出力されます:

nil C:/Users/KayWang/Desktop/测试.txt: No such file or directory 

私はWINAPIを使用したくありません と私は本当になぜこの機能がユニコードのパスをサポートできないのか知りたいですか?

+1

ルア標準ライブラリ関数は、OSネイティブコードページでのみファイル名を受け入れます。 Windows上のLuaでは、 'io.open'を呼び出す前に、手動でファイル名をUTF-8からWindowsのコードページに変換する必要があります(おそらくCP936です)。 –

+0

ありがとう!私はUTF-8からGBKにファイル名を変換し、それは動作します! – KayWang

答えて

1

一般には不可能です。

など。私のWindowsシステムにはデフォルトのcp-1251(ロシア語)があり、あなたのパスを表すことができません。だから、このファイルを開くには私はユニコードパスを使用しなければなりません。 しかし、C APIはこのような機能を提供していません。しかし、あなたのコードページがあなたのパスをサポートしているなら、ユニコードパスをそれに変換してio.openと一緒に使うことができます。 それ以外の場合は、Cコードを使用する必要があります。簡単な方法は、UTF-16を引数として使用する_wfopenのようなMSエクステンションを使用することだと思います。他の方法は、CreateFileWを使用して、ファイルディスクリプタとこのディスクリプタをファイルポインタにラップします。

また、このようなパスをサポートする外部IOライブラリを使用することもできます。 私は自分のlibuvバインディングをテストし、私のシステム上でファイルを読み書きすることができます。 (utf-8のファイルパス)

関連する問題