2

C++ アドオンから node.js のファイルをレンダリングしたいと思います。ファイル処理を適用し、出力を node.js 経由でブラウザにレンダリングしたい

ここに私のC++コードがあります

    std::ifstream in(filename, std::ios::binary);

    in.seekg (0, in.end);
    int length = in.tellg();
    in.seekg (0, in.beg);

    char * buffer = new char [length];
    in.read (buffer,length);
    in.close();

    return buffer;

以下は、node.js のバインディングを追加する V8 コードです。ここで、bufferは上記の C++ コードからの出力です。

    Local<Function> cb = Local<Function>::Cast(args[1]);
    const unsigned argc = 1;
    Local<Value> argv[argc] = {Local<Value>::New(String::New(buffer))};
    cb->Call(Context::GetCurrent()->Global(), argc, argv);

このコードは、通常のテキスト ファイルに適しています。Unicode 文字を含むテキスト ファイルを読み取るときに問題が発生します。たとえば、

元のテキスト ファイル

test start
Billél
last

ノードで受信すると、取得します

test start
Bill�l
last

同様に、jpg、png ファイルを読み取る場合、出力ファイルは元のファイルとは異なります。助けてください。

4

1 に答える 1

1

私もこれに問題がありました。Google の V8 の例で実装を見つけました。UTF8でエンコードされたファイルを適切に処理することがわかった例は、次のとおりです。

https://code.google.com/p/v8/source/browse/trunk/samples/shell.cc#218

ソースをこれに適合させました:

const char* ReadFile(const char* fileName, int* fileSize)
{
    // reference to c-string version of file
    char *fileBuffer = 0;

    // attempt to open the file
    FILE* fd = fopen(fileName, "rb");

    // clear file size
    *fileSize = 0;

    // file was valid
    if(fd != 0)
    {
       // get size of file
       fseek(fd, 0, SEEK_END);
       *fileSize = ftell(fd);
       rewind(fd);

       // allocate file buffer for file contents
       fileBuffer = (char*)malloc(*fileSize + 1);
       fileBuffer[*fileSize] = 0;

       // copy file contents
       for (int charCount = 0; charCount < *fileSize;)
       {
           int charRead = static_cast<int>(fread(&fileBuffer[charCount], 1, *fileSize - charCount, fd));
           charCount += charRead;
       }

       // close the file
       fclose(fd);
    }

    return fileBuffer;
}

また、V8 文字列を作成するときは、必ずString::Utf8Valueを作成してください。

String::Utf8Value v8Utf8String(...);

次に、次の関数を使用String::Utf8Valueして使用します。char*

https://code.google.com/p/v8/source/browse/trunk/samples/shell.cc#91

于 2013-11-25T16:48:52.727 に答える