問題是:如何在運行時設置編碼時解析文件?如何將ubyte []解碼爲指定的編碼?
編碼可以是:UTF-8,UTF-16,LATIN1或其他
的目標但是UBYTE []轉換爲字符串從所選擇的編碼。因爲當你使用std.stdio.File.byChunk或std.mmFile.MmFile時,你有ubyte []作爲數據。
問題是:如何在運行時設置編碼時解析文件?如何將ubyte []解碼爲指定的編碼?
編碼可以是:UTF-8,UTF-16,LATIN1或其他
的目標但是UBYTE []轉換爲字符串從所選擇的編碼。因爲當你使用std.stdio.File.byChunk或std.mmFile.MmFile時,你有ubyte []作爲數據。
我已經找到一種方法,也許還可以利用std.algorithm.reduce應該會更好
import std.string;
import std.stdio;
import std.encoding;
import std.algorithm;
void main(string[] args){
File f = File("pathToAfFile.txt", "r");
size_t i;
auto e = EncodingScheme.create("utf-8");
foreach(const(ubyte)[] buffer; f.byChunk(4096)){
size_t step = 0;
if(step == 0) step = e.firstSequence(buffer);
for(size_t start; start + step < buffer.length; start = start + step)
write(e.decode(buffer[start..start + step]));
}
}
這是一個不好的解決方案。塊大小可能會在UTF-8序列的中間切割文件。它看起來像你的代碼不會導致任何異常,但它會跳過字符。 – 2012-03-11 13:23:04
,直到chunk是utf-8(或其他)長度的倍數是安全的。 e.firstSequence授予了這一點。如果e.firstSequence的值是塊值的倍數,則可以。 – bioinfornatics 2012-03-11 16:17:42
UTF-8是一種可變長度編碼。 – 2012-03-11 16:52:29
你是不是想文本文件轉換爲UTF-8? 如果答案是肯定的,Phobos的功能特別如下:@trusted string toUTF8(in char[] s)
。 有關詳細信息,請參閱http://dlang.org/phobos/std_utf.html。
對不起,如果它不是你所需要的。
toUTF8唯一能做的就是驗證輸入字符串並返回它的一個副本。 D的'string'類型已經使用UTF-8。 [來源](https://github.com/D-Programming-Language/phobos/blob/master/std/utf.d#L1231) – 2012-03-11 13:25:33
@CyberShadow好的,但如何將這個「標準」的UTF-8轉換爲一些另一種編碼?我在std.encoding中只找到了這個:'void transcode(Src,Dst)(immutable(Src)[] s,out immutable(Dst)[] r)' – Raxillan 2012-03-11 14:45:07
Yes:'Latin1String ls;轉碼(myUtf8String,ls);' – 2012-03-11 15:21:10
D字符串已經是UTF-8。沒有轉碼是必要的。您可以使用validate
從std.utf
檢查文件是否包含有效的UTF-8。如果您使用std.file
中的readText
,它將爲您進行驗證。
我知道這是一個例子。我想閱讀各種編碼的文本。它可以是latin1或其他。 – bioinfornatics 2012-03-11 13:50:30
這就是爲什麼說你想解決的實際問題很重要! :)隨着你發佈的代碼,我只能猜測你真的想做什麼。 – 2012-03-11 14:40:02
我編輯了這個問題。實際上,我想使用1)MmFile 2)在運行時將ubyte []轉換爲編碼。首先它是好的。 – bioinfornatics 2012-03-12 06:50:34
File.byChunk返回一個範圍,它通過front返回一個ubyte []。
快速谷歌搜索似乎表明UTF-8使用1到6個字節來編碼數據,所以只要確保您總是有6個字節的數據,並且您可以使用std.encoding的解碼將它轉換爲一個dchar字符。然後,您可以使用std.utf的toUFT8轉換爲常規字符串而不是dstring。
下面的轉換函數將把任何無符號數組範圍轉換爲一個字符串。
import std.encoding, std.stdio, std.traits, std.utf;
void main()
{
File input = File("test.txt");
string data = convert(input.byChunk(512));
writeln("Data: ", data);
}
string convert(R)(R chunkRange)
in
{
assert(isArray!(typeof(chunkRange.front)) && isUnsigned!(typeof(chunkRange.front[0])));
}
body
{
ubyte[] inbuffer;
dchar[] outbuffer;
while(inbuffer.length > 0 || !chunkRange.empty)
{
while((inbuffer.length < 6) && !chunkRange.empty)// Max UTF-8 byte length is 6
{
inbuffer ~= chunkRange.front;
chunkRange.popFront();
}
outbuffer ~= decode(inbuffer);
}
return toUTF8(outbuffer); // Convert to string instead of dstring
}
而不是發佈代碼,而是應該描述您嘗試解決的問題。 – 2012-03-11 13:27:49
好的,謝謝 – bioinfornatics 2012-03-12 11:02:58