2

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

4

3 回答 3

2

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

于 2011-10-20T10:09:10.310 回答
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
于 2011-10-20T11:44:51.650 回答
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)。 71).aspx来写。

示例代码在提供的链接中。

于 2010-10-11T10:54:11.460 回答