我正在尝试从文件中读取字符并删除标点后。我想将这些单词存储在一个数组中,最后将它们写入另一个文件。该文件的内容是: -
“的यौताबाबूउदयभाहूउपेक्षाऔंरअपमान्नकीपीड््ाढोयेजैसेतैस्येवहबाबाकेआश्रमम्पेंपहैचगया。 बाबामान्नोउसीकीप्रतीक्षाम्पेंवैठेथे。 वहज्योहीदण्डवतकीमुदाम्पेंहुभ्रात्योंही बाबाकागभ्रीरस्वरउसकेकानोंम्पेटकराया'आभ्रो,ञैंतुम्हारेलिएहीबैठाहूें。 “ 这是一个不错的选择。 बाबा केपासवहअनेकोंबारआआुकाथापरन्तु。 आजजैसीव्यथा,थकान्नऔंरप्तानता 更多信息更多信息更多信息更多信息更多信息更多信息更多信息 केप्रतिभ्रीशंकाहोन्नेलगतीन्हैवहंअेेेवेंरोंम्पेंखोगयाउसकेनेत्रबाबा कौदेखरहेथेपरन्तुउस्यकामनकहींऔंरभ्रटकरद्दाथा。“ ........
我尝试使用旧的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();
}
答案 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或历史字符
今天没有使用的脚本,所以这对你来说可能不是问题。)