Utf 8 相同的.txt文件,不同的大小?
我有一个程序可以读取.txt文件 我使用cmd提示符以要读取的文本文件的名称执行程序 例如:program.exe myfile.txt 问题是,有时有效,有时无效 原始文件为130KB,无法工作。 如果复制/粘贴内容,则文件大小为65KB,可以正常工作。 如果我复制/粘贴文件并重命名它,它的大小为130KB,无法工作 有什么想法吗 经过更多的测试,它表明这是它无法工作的原因:Utf 8 相同的.txt文件,不同的大小?,utf-8,size,fgets,utf-16,unicode-string,Utf 8,Size,Fgets,Utf 16,Unicode String,我有一个程序可以读取.txt文件 我使用cmd提示符以要读取的文本文件的名称执行程序 例如:program.exe myfile.txt 问题是,有时有效,有时无效 原始文件为130KB,无法工作。 如果复制/粘贴内容,则文件大小为65KB,可以正常工作。 如果我复制/粘贴文件并重命名它,它的大小为130KB,无法工作 有什么想法吗 经过更多的测试,它表明这是它无法工作的原因: int main(int argc, char *argv[]) { char *infile1 ch
int main(int argc, char *argv[])
{
char *infile1
char tmp[1024] = { 0x0 };
FILE *in;
for (i = 1; i < argc; i++) /* Skip argv[0] (program name). */
{
if (strcmp(argv[i], "-sec") == 0) /* Process optional arguments. */
{
opt = 1; /* This is used as a boolean value. */
/*
* The last argument is argv[argc-1]. Make sure there are
* enough arguments.
*/
if (i + 1 <= argc - 1) /* There are enough arguments in argv. */
{
/*
* Increment 'i' twice so that you don't check these
* arguments the next time through the loop.
*/
i++;
optarg1 = atoi(argv[i]); /* Convert string to int. */
}
}
else /* not -sec */
{
if (infile1 == NULL) {
infile1 = argv[i];
}
else {
if (outfile == NULL) {
outfile = argv[i];
}
}
}
}
in = fopen(infile1, "r");
if (in == NULL)
{
fprintf(stderr, "Unable to open file %s: %s\n", infile1, strerror(errno));
exit(1);
}
while (fgets(tmp, sizeof(tmp), in) != 0)
{
fprintf(stderr, "string is %s.", tmp);
//Rest of code
}
}
但是在strtok中对char*的类型转换也不起作用
现在我正在寻找一种方法,将文件从UTF-16转换为UTF-8,这样tmp就可以是char类型*
我发现这看起来很有用,但在示例中,它使用来自用户的输入作为UTF-16,如何从文件中获取该输入?
听起来很像原始文件是UTF-16编码的。在文本编辑器中复制/粘贴时,将结果保存为新的(默认编码)(ASCII或UTF-8)文本文件。由于单个字符在UTF-16编码文件中占用2个字节,但在UTF-8编码文件中仅占用1个字节,因此在保存文件时,文件大小大约会减半
UTF-16还可以,但您需要使用Unicode感知函数(即,不是
fgets
)来处理它。如果您现在不想处理所有Unicode jazz,并且文件中实际上没有任何非ASCII字符可处理,只需在运行程序之前进行手动转换(使用复制/粘贴或命令行实用程序)。谢谢!听起来可能是这样:)你知道我可以从哪里着手处理“所有的Unicode jazz”?大多数标准输入/输出例程都有广泛的字符版本。例如,请参阅fgetws
的文档。问题是,您需要提前检测或知道文件具有宽字符编码。最好坚持使用ASCII或UTF-8;后者允许您使用包含字符串的国际字符执行相当多的操作,就好像它们是ASCII一样,尽管不是全部。
//tmp is passed as the first parameter in parse()
void parse(wchar_t *record, char *delim, char arr[][MAXFLDSIZE], int *fldcnt)
{
if (*record != NULL)
{
char*p = strtok((char*)record, delim);
int fld = 0;
while (p) {
strcpy(arr[fld], p);
fld++;
p = strtok('\0', delim);
}
*fldcnt = fld;
}
else
{
fprintf(stderr, "string is null");
}
}