3

問題は、実行時にエンコーディングが設定されている場合にファイルを解析する方法ですか?

エンコーディングは次のとおりです: utf-8utf-16latin1またはその他

目標は、選択したエンコーディングから ubyte[] を文字列に変換することです。std.stdio.File.byChunk または std.mmFile.MmFile を使用すると、データとして ubyte[] があるためです。

4

4 に答える 4

1

テキストファイルをutf-8に変換しようとしていますか? 答えが「はい」の場合、フォボスにはこれに特化した機能があります@trusted string toUTF8(in char[] s)。詳細については、 http://dlang.org/phobos/std_utf.htmlを参照してください。

必要なものではない場合は申し訳ありません。

于 2012-03-11T03:17:45.417 に答える
0

私は方法を見つけました。おそらく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] ) );
    }
}
于 2012-03-10T21:09:56.313 に答える
0

D 文字列はすでに UTF-8 です。トランスコーディングは必要ありません。validatefromを使用しstd.utfて、ファイルに有効な UTF-8 が含まれているかどうかを確認できます。readTextfromを使用するstd.fileと、検証が行われます。

于 2012-03-11T13:21:54.773 に答える
0

File.byChunk は、front 経由で ubyte[] を返す範囲を返します。

簡単なGoogle検索は、UTF-8が1から6バイトを使用してデータをエンコードすることを示しているように見えたので、常に6バイトのデータがあり、std.encodingのデコードを使用してdchar文字に変換できることを確認してください。その後、std.utf の toUFT8 を使用して、dstring の代わりに通常の文字列に変換できます。

以下の convert 関数は、符号なしの配列範囲を文字列に変換します。

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-09-25T12:21:59.430 に答える