从包含utf-8(HINDI)格式文本的文件读取并写入另一个文件

时间:2012-07-11 06:52:15

标签: c++ visual-c++ file-handling wchar-t widechar

我正在尝试从文件中读取字符并删除标点后。我想将这些单词存储在一个数组中,最后将它们写入另一个文件。该文件的内容是: -

  

“的यौताबाबूउदयभाहूउपेक्षाऔंरअपमान्नकीपीड््ाढोयेजैसेतैस्येवहबाबाकेआश्रमम्पेंपहैचगया。   बाबामान्नोउसीकीप्रतीक्षाम्पेंवैठेथे。 वहज्योहीदण्डवतकीमुदाम्पेंहुभ्रात्योंही   बाबाकागभ्रीरस्वरउसकेकानोंम्पेटकराया'आभ्रो,ञैंतुम्हारेलिएहीबैठाहूें。 “   这是一个不错的选择。 बाबा   केपासवहअनेकोंबारआआुकाथापरन्तु。 आजजैसीव्यथा,थकान्नऔंरप्तानता   更多信息更多信息更多信息更多信息更多信息更多信息更多信息   केप्रतिभ्रीशंकाहोन्नेलगतीन्हैवहंअेेेवेंरोंम्पेंखोगयाउसकेनेत्रबाबा   कौदेखरहेथेपरन्तुउस्यकामनकहींऔंरभ्रटकरद्दाथा。“ ........

我尝试使用旧的turbo c ++读取这些字符(Hindi-- utf-8)。使用简单的char 数据类型

程序已编译但内容未正确写入文件。 然后我使用相同的代码在 visual c ++ 中使用相同的编码,我得到了错误 -

"Debug assertion failed ... unsigned(c+1) <=256"

接下来我尝试使用宽字符数据类型来实现此目的。 using<wchar.h><cwchar.h>标题文件和数据类型 wchar_t 以及其他宽字符函数但仍然输出不正确 - “ त ྤ ௤ྤ “

是否有任何替代方法或任何其他方法来解决此问题。

回答完整的代码段还告诉我wchar的getline函数的替代方法是什么。这就是我试图做的......

#include<sstream>
#include<iostream>
#include<fstream>
#include<ctype.h>
#include<string>
#include<stdio.h>
#include<conio.h>
#include <istream>
#include<vector>
#include<string>
#include<stdlib.h>
#include<iostream>
#include<fstream>
#include<ctype.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<vector>
#include<wchar.h>
#include<cwchar>
#include <locale.h>
#include <cwchar>
using namespace std;
unsigned char line[1000],storech[2000],storech1[20000];
wchar_t word[50];
std::vector< wchar_t* > storewrd;

void main()
{ 
    FILE * file3 = fopen("H:\\myfile.txt" , "w");
    cout << "check" << endl;
    FILE *stream;
    stream = fopen( "H:\\ocr.txt", "r" );
    setlocale(LC_ALL,"");
    int ch;
    int  test;
    wchar_t temp1;
    wchar_t buffer[500];
    wchar_t temp[500];

    int x=0,j=0;
        do
    {
        int loop = 0;
        ch = fgetwc(stream);

        //read word 
        while( (ch != '\n') && (ch != WEOF) ) 
        {
                buffer[loop] = ch;
            loop++;


         test = fgetwc(stream);
         temp1 = (wchar_t) test;
         if(!iswpunct(test))    
         fputwc( test , file3);
             wcout << temp1 << "  ";


        }


            int t;
        if (ch!= WEOF)
        {
             for(t=0;t<loop;t++)
             {
            temp[t] = buffer[t];
             }
             temp[loop++] = '\0';

                j++;
                //cout << buffer[loop] << "  ";
        }       
    }while(ch != WEOF);

    cout << "check";


    _getch();

}

3 个答案:

答案 0 :(得分:0)

您可以尝试使用ICU

答案 1 :(得分:0)

stdio文件函数,如fwprintf或fputwc,在内部将输出转换为ASCII,即使使用unicode变体也是如此。我也遇到过这个问题。

但是由于您的编码是UTF-8,为什么不将它作为ASCII读取并将其写为ASCII? UTF-8的编码方式应该适用于那些不知道他们使用的是UTF-8而不是ASCII的程序。

答案 2 :(得分:0)

我真的不清楚你要做什么:它在哪里 断言失败了吗?你是如何确定是否 字符是标点符号还是不符号?

UTF-8是一种多字节编码,表示单字节 像ispunct这样的函数不起作用。它是一个可变长度 但是,编码原始ASCII码中的所有字符 set具有单字节编码。 如果是你唯一的标点符号 关注的是原始ASCII中的字符,你可以 “欺骗”一点,并使用类似的东西:

if ( (ch & 0x80) == 0 && ispunct( ch ) ) {
    //  is ASCII punctuation
} else {
    //  is something else
}

我把“作弊”放在引号中,因为Unicode的目标之一 和UTF-8是寻找ASCII标点符号的代码 应该保持不变。

如果您需要识别的不仅仅是ASCII标点符号(例如 比如«¿),您想使用wchar_t (通常,但不总是UTF-16或UTF-32),文件是 UTF-8,您需要使用适当的区域设置来执行代码 翻译。在这种情况下,你应该肯定使用iostream,和 不是C风格IO; iostream将允许你灌输流 适当的语言环境,C ++语言环境允许您创建语言环境 飞行,通过改变单个方面(在这种情况下为codecvt) 另一个语言环境(可能是全局语言环境)。 (在Linux下,全球 语言环境,特别是在非英语区域,通常是UTF-8 locale,可以直接使用。在Windows下,我希望它 是一个UTF-16语言环境,它不能正确转换UTF-8。)如果你 不想参与区域设置,直接将您的UTF-8读入 char缓冲区,并使用iconv库或类似的东西 在你的程序中翻译它。但请注意,可能存在 在基本平面之外是一些罕见的标点符号 使用UTF-16中的两个代理字符编码; iswpunct不会 如果您的wchar_t使用UTF-16(Windows和AIX),则可以为这些工作。 (最 基本平面以外的字符是CJK或历史字符 今天没有使用的脚本,所以这对你来说可能不是问题。)