Вопрос:
Я новичок в c++. Мне нужно выяснить тип кодировки, содержащий файл, который передается пользователем. Но я не знаю, как проверить кодировку файла. поэтому мне нужно распечатать, является ли файл unicode или ansi или unicode большим endian или utf8.Я много искал, но не смог найти решение. До сих пор я сделал это, я открыл файл:
#include «stdafx.h» #include <iostream.h> #include <stdio.h> #include<conio.h> #include <fstream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { fstream f; f.open(«c:abc.txt», fstream::in | fstream::out); /* Read-write. */ getch(); return 0; }
SO, пожалуйста, кто-нибудь может сказать мне, что это решение кода.
что, если я обращаюсь к файлу блокнота?
Thanx заранее..
Лучший ответ:
Здесь я нашел способ обнаружить файл блокнота, будь то Unicode, Big Endian, UTF8 или простой файл ANSI:
Я обнаружил, что когда я сохраняю файл в блокноте по умолчанию, он хранит Byte of Mark (BOM) в начале файла. Поэтому я решил использовать его в соответствии с более ранними предложениями в этом вопросе.
Прежде всего, я прочитал 1 байт моего файла. Я уже знал, что 1. если файл является файлом Unicode, то его первые два символа сохраняют FE FF ie254 255, это его десятичный эквивалент. 2. Если файл является файлом UTF8, то его первые характеристики хранят FF, а 239 – десятичный эквивалент.
вот код:
#include<conio.h> #include<stdio.h> #include<string.h> int main() { FILE *fp=NULL; int c; int a[2]; int i; fp=fopen(«c:\abc.txt»,»rb»); if (fp != NULL) { while (i<=3) { c = fgetc(fp); printf(«%d»,c); if(c==254) { printf(«Unicode Big Endian File»); } else if(c==255) { printf(«Unicode Little Endian File»); } else if(c==239) { printf(«UTF8 file»); } else { printf(«ANSI File»); } } fclose(fp); } getchar(); return 0; }
Это сработало хорошо для меня. Надеюсь, это будет работать и на других.
Ответ №1
Ты не можешь.
Лучшее, что вы можете сделать, это угадать или сохранить кодировку как часть вашей файловой структуры (если можно).
Ответ №2
Вы не можете знать, что такое кодировка текстового файла. Один из способов сделать это – искать спецификацию в начале файла, и это скажет вам, находится ли текст в Юникоде. Однако спецификация не является обязательной, поэтому вы не можете полагаться на нее, чтобы отличать Unicode от других кодировок.
Очень распространенный способ представить эту проблему состоит в том, что нет простого текста.
Я испанский, и вы можете легко найти здесь текстовые файлы в 7-битном ASCII, расширенном ASCII, ISO-8859-1 (aka Latin 1, который включает в себя множество распространенных дополнительных символов, необходимых для западной Европы), а также UTF в его вариантах ароматизаторы.
Надеюсь, это поможет.
Ответ №3
Файлы обычно указывают на их кодировку с заголовком файла.
И, как предложили другие, вы никогда не можете быть уверены, что кодирование файла действительно используется.
Следуйте этим ссылкам, чтобы получить общее представление:
Использование байтов
ТАБЛИЦА ПОДПИСАНИЙ ФАЙЛОВ
Ответ №4
Как обсуждалось здесь, единственное, что вы можете сделать, это guess в лучшем порядке, который, скорее всего, выкинет недопустимые совпадения.
Вы должны проверить в этом порядке:
- Есть ли спецификация UTF-16 в начале? Тогда это, вероятно, UTF-16. Используйте спецификацию в качестве индикатора, будь то большой эндиан или немного endian, затем проверьте остальную часть файла, соответствует ли она.
- Есть ли спецификация UTF-8 в начале? Тогда это, вероятно, UTF-8. Проверьте оставшуюся часть файла.
- Если вышеуказанное не привело к положительному совпадению, проверьте, действителен ли весь файл UTF-8. Если это так, вероятно, UTF-8.
- Если вышеуказанное не привело к положительному совпадению, это, вероятно, ANSI.