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

发布于 2024-09-26 14:26:10 字数 49 浏览 5 评论 0原文

谁能提供一个简单的例子来在 Unicode 文件中读取和写入 Unicode 字符?

Can anyone Provide a Simple Example to Read and Write in the Unicode File a Unicode Character ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

只想待在家 2024-10-03 14:26:10

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

try http://utfcpp.sourceforge.net/. the link has an introductory example to read a utf8 file, line by line.

人海汹涌 2024-10-03 14:26:10

在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,您最终会得到每个 iinput 字节为 4 个字节的输出。因此,内部循环将通过检查 conv_res 然后检查 errno 来处理此问题。

On linux I use the iconv (link) library which is very standard. An overly simple program is:

#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;
}

This is overly simple to demonstrate the conversion. In the real world you would normally have two nested loops:

  • One reading input, so handle when its more than BUF_SZ
  • One converting input to output. Remember if you're converting from ascii to UTF-32LE you will end up with each iunput byte being 4 bytes of output. So the inner loop would handle this by examining conv_res and then checking errno.
零度° 2024-10-03 14:26:10

如果您使用的是 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 来编写。

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

In case you're using Windows.
Use fgetws http://msdn.microsoft.com/en-us/library/c37dh6kf(VS.71).aspx to read
and fputws http://msdn.microsoft.com/en-us/library/t33ya8ky(VS.71).aspx to write.

The example code are in the provided links.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文