用C ++编写和编写Unicode文件?

时间:2010-10-11 10:11:09

标签: c++ unicode unicode-string

任何人都可以提供一个简单的示例来在Unicode文件中读取和写入Unicode字符吗?

3 个答案:

答案 0 :(得分:2)

尝试http://utfcpp.sourceforge.net/。该链接有一个逐行读取utf8文件的介绍性示例。

答案 1 :(得分:1)

在linux上我使用非常标准的iconv (link)库。一个过于简单的程序是:

#include <stdio.h>
#include <stdlib.h>
#include <iconv.h>

#define BUF_SZ  1024
int main( int argc, char* argv[] )
{
    char bin[BUF_SZ];
    char bout[BUF_SZ];
    char* inp;
    char* outp;
    ssize_t bytes_in;
    size_t bytes_out;
    size_t conv_res;
    if( argc != 3 )
    {
        fprintf( stderr, "usage: convert from to\n" );
        return 1;
    }
    iconv_t conv = iconv_open( argv[2], argv[1] );
    if( conv == (iconv_t)(-1) )
    {
        fprintf( stderr, "Cannot conver from %s to %s\n",  argv[1], argv[2] );
        return 1;
    }

    bytes_in = read( 0, bin, BUF_SZ );
    {
        bytes_out = BUF_SZ;
        inp = bin;
        outp = bout;
        conv_res = iconv( conv, &inp, &bytes_in, &outp, &bytes_out );
        if( conv_res >= 0 )
        {
            write( 1, bout, (size_t)(BUF_SZ) - bytes_out );
        }
    }
    iconv_close( conv );
    return 0;
}

演示转换过于简单。在现实世界中,您通常会有两个嵌套循环:

  • 一个读数输入,所以当它超过BUF_SZ
  • 时处理
  • 将输入转换为输出。请记住,如果您从ascii转换为UTF-32LE,您将最终得到每个输出字节为4个字节的输出。因此内部循环将通过检查conv_res然后检查errno
  • 来处理此问题

答案 2 :(得分:0)

如果您使用的是Windows。 使用fgetws http://msdn.microsoft.com/en-us/library/c37dh6kf(VS.71).aspx阅读 和fputws http://msdn.microsoft.com/en-us/library/t33ya8ky(VS.71).aspx写。

示例代码位于提供的链接中。