Мое решение состоит в том, чтобы использовать встроенные компоненты с некоторыми резервными ошибками.
Я выбрал стратегию из ответа на другой подобный вопрос о stackoverflow, но я не могу его найти сейчас.
Он сначала проверяет спецификацию, используя встроенную логику в StreamReader, если есть спецификация, кодировка будет чем-то иным, чем Encoding.Default
, и мы должны доверять этому результату.
Если нет, он проверяет является ли последовательность байтов действительной последовательностью UTF-8. если это так, он будет считать UTF-8 в качестве кодировки, а если нет, то в результате будет использоваться кодировка ASCII по умолчанию.
static Encoding getEncoding(string path) {
var stream = new FileStream(path, FileMode.Open);
var reader = new StreamReader(stream, Encoding.Default, true);
reader.Read();
if (reader.CurrentEncoding != Encoding.Default) {
reader.Close();
return reader.CurrentEncoding;
}
stream.Position = 0;
reader = new StreamReader(stream, new UTF8Encoding(false, true));
try {
reader.ReadToEnd();
reader.Close();
return Encoding.UTF8;
}
catch (Exception) {
reader.Close();
return Encoding.Default;
}
}
Я предполагаю, что предлагаемое вами решение состоит в том, чтобы проверить, все ли буквенно-цифровые символы находятся внутри строки. Этот метод не будет работать, потому что вы также должны учитывать длину строки, потому что можно получить строку, которая содержит все буквенно-цифровые символы плюс один специальный символ.
Если не считать вложенных тысяч операторов if для обнаружения не алфавитно-цифровых символов, это решение работает:
(я предполагаю, что Text
можно повторять в , используя циклы for на основе диапазона)
Вы можете использовать std::find_if
#include <algorithm>
#include <iterator>
#include <cctype>
#include <iostream>
auto it = std::find_if(std::begin(Text), std::end(Text), [](const char c) {
return std::isalnum(c) == 0; // Not alphanumeric
});
if (it == std::end(Text)) {
std::cout << "Text is fine!";
} else {
std::cout << "Text contains non-alphanumeric character: '" << *it << "'";
}
std::cout << std::endl;