gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:15:45 24 4
gpt4 key购买 nike

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

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

我尝试使用旧的 Turbo C++ 读取这些字符(印地语——utf-8)。使用简单的字符数据类型

程序已编译但内容未正确写入文件。然后我在 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();

}

最佳答案

我不太清楚你想做什么:发生断言失败?您如何尝试确定字符是标点符号还是不是?

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-8locale,可以直接使用。在 Windows 下,我希望它能是 UTF-16 语言环境,它不会正确翻译 UTF-8。)如果你不想涉及语言环境,直接将你的 UTF-8 读入char 缓冲区,并使用 iconv 库或类似的东西在你的程序中翻译它。但是请注意,可能有是基本平面之外的一些罕见标点符号,这将是使用 UTF-16 中的两个代理字符编码; iswpunct 不会如果您的 wchar_t 使用 UTF-16(Windows 和 AIX),请为这些工作。 (最多基本平面外的字符是 CJK 或来自历史今天不使用的脚本,所以这对你来说可能不是问题。)

关于c++ - 从包含 utf-8(HINDI) 格式文本的文件中读取并写入另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11427103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com