1

ファイルから文字を読み込もうとしていますが、句読点を削除しました。単語を配列に格納し、最後に別のファイルに書き込みたいです。ファイルの内容は次のとおりです:-

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

古いturboc++を使用してこれらの文字(ヒンディー語--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

あなたが何をしようとしているのか、私にはよくわかりません。アサーションの失敗はどこで発生しましたか? 文字が句読点かどうかをどのように判断しようとしていますか?

UTF-8 はマルチバイト エンコーディングです。つまり、UTF-8 のようなシングル バイト関数は機能ispunctしません。ただし、これは可変長エンコーディングであり、元の ASCII コード セットの文字はすべてシングル バイト エンコーディングです。 関心のある唯一の句読点が元の ASCII の文字である場合は、少し「ごまかす」ことができ、次のようなものを使用できます。

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

Unicode と UTF-8 の目標の 1 つは、ASCII 句読点などを検索するコードが変更されずに機能することであるため、「チート」を引用符で囲みました。

単なる ASCII 句読点以上のもの (たとえば«,¿や など) を認識する必要があり 、(通常は UTF-16 または UTF-32 であるとは限りませんが、常にではありません) 使用したい場合で、ファイルが UTF-8 の場合は、wchar_tコード変換を行う適切なロケールを使用する必要があります。この場合、 C スタイルの IO ではなく、確実に iostream を使用する必要があります。iostream を使用すると、ストリームに適切なロケールを吹き込むことができ、C++ ロケールを使用すると、単一のファセット (codecvt、この場合) 別のロケール (おそらくグローバルなもの) から。(Linux では、グローバル ロケールは、特に英語を話さない地域では、多くの場合、直接使用できる UTF-8 ロケールです。Windows では、UTF を変換しない UTF-16 ロケールであると予想します。 -8 は正しく。) ロケールに関与したくない場合は、UTF-8 を直接 charバッファーに読み込み、iconvライブラリーまたは同様のものを使用してプログラム内で翻訳します。ただし、まれに、基本面の外側に句読点が含まれる可能性があることに注意してください。これは、UTF-16 で 2 つのサロゲート文字を使用してエンコードされます。iswpunctあなたの場合、これらでは機能しませんwchar_tUTF-16 を使用します (Windows および AIX)。(基本面外の文字のほとんどは CJK または今日使用されていない歴史的なスクリプトからのものであるため、これは問題にならない可能性があります。)

于 2012-07-11T08:00:30.117 に答える
0

これにはICUを使用してみてください。

于 2012-07-11T07:11:37.920 に答える
0

fwprintf や fputwc などの stdio ファイル関数は、Unicode バリアントを使用している場合でも、内部で出力を ASCII に変換します。私もこの問題を抱えていました。

しかし、エンコーディングが UTF-8 であるため、ASCII として読み取り、ASCII として記述しないのはなぜですか? UTF-8 は、ASCII の代わりに UTF-8 を使用していることを認識していないプログラムで動作するようにエンコードされています。

于 2012-07-11T07:25:30.217 に答える