1

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

यौताबाबूउदयभाहूउपेक्षाऔंरअपमान्नकीपीड््ाढोये जैसेतैस्येवहबाबाकेआश्रमम्पेंपहैचगया 。बाबामान्नोउसीकीप्रतीक्षाम्पेंवैठेथे。वहज्योहीदण्डवतकीमुदाम्पेंहुभ्रात्योंही बाबाकागभ्रीरस्वरउसकेकानोंम्पेटकराया 'आभ्रो,ञैंतुम्हारेलिएहीबैठाहूें 'अमितन्नेमस्तकऊैंचाउठायाऔंरएकाम्रभाव न्सेबाबाकोदेखतारहा 。बाबाकेपासवहअनेकोंबारआचुका थापरन्तु 。आजजैसीव्यथा,थकान्नऔंरप्तानताइससेदूर्वनहींथीआदमी कभ्रीकभीइतनाटूटञाताड़ँकिठसेअपनेअस्तिल्दकेप्रति भलगतीलगतीलगतीवहवहखोपेंपेंपेंखोउसकेउसकेउसकेकौकौकौकौहेहेहेहेथेथे ...........

我尝试使用旧的 turbo c++ 读取这些字符(印地语 - 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();

}
4

3 回答 3

0

您可以尝试为此使用ICU 。

于 2012-07-11T07:11:37.920 回答
0

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

但是既然你的编码是UTF-8,那你为什么不把它读成ASCII,写成ASCII呢?UTF-8 以这样一种方式编码,它应该与不知道他们使用 UTF-8 而不是 ASCII 的程序一起工作。

于 2012-07-11T07:25:30.217 回答
0

我不太清楚您要做什么:断言失败发生在哪里?您如何确定字符是否为标点符号?

UTF-8 是一种多字节编码,这意味着像单字节这样的函数ispunct对它不起作用。但是,它是一种可变长度编码,并且原始 ASCII 代码集中的所有字符都具有单字节编码。 如果您关心的唯一标点符号是原始 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语言环境,可以直接使用。在Windows下,我希望它是UTF-16语言环境,不会翻译UTF -8 正确。)如果您不想参与语言环境,请将您的 UTF-8 直接读入 char缓冲区,然后使用iconv库或类似的东西在您的程序中翻译它。但是请注意,在基本平面之外可能会有一些罕见的标点符号,这些标点符号将使用 UTF-16 中的两个代理字符进行编码;iswpunct如果你的将不适用于这些wchar_t使用 UTF-16(Windows 和 AIX)。(基本位面之外的大多数字符都是 CJK 或来自今天未使用的历史脚本,所以这对您来说可能不是问题。)

于 2012-07-11T08:00:30.117 回答