1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-25 22:42:04 +02:00

Fonts will now correctly detect encoding of fonts from mods

This commit is contained in:
Ivan Savenko
2023-02-25 01:11:42 +02:00
parent 4260726e4b
commit 9b428e8231
5 changed files with 128 additions and 46 deletions

View File

@@ -112,6 +112,49 @@ bool TextOperations::isValidUnicodeString(const char * data, size_t size)
return true;
}
uint32_t TextOperations::getUnicodeCodepoint(const char * data, size_t maxSize)
{
assert(isValidUnicodeCharacter(data, maxSize));
if (!isValidUnicodeCharacter(data, maxSize))
return 0;
// https://en.wikipedia.org/wiki/UTF-8#Encoding
switch (getUnicodeCharacterSize(data[0]))
{
case 1:
return static_cast<uint8_t>(data[0]) & 0b1111111;
case 2:
return
((static_cast<uint8_t>(data[0]) & 0b11111 ) << 6) +
((static_cast<uint8_t>(data[1]) & 0b111111) << 0) ;
case 3:
return
((static_cast<uint8_t>(data[0]) & 0b1111 ) << 12) +
((static_cast<uint8_t>(data[1]) & 0b111111) << 6) +
((static_cast<uint8_t>(data[2]) & 0b111111) << 0) ;
case 4:
return
((static_cast<uint8_t>(data[0]) & 0b111 ) << 18) +
((static_cast<uint8_t>(data[1]) & 0b111111) << 12) +
((static_cast<uint8_t>(data[2]) & 0b111111) << 6) +
((static_cast<uint8_t>(data[3]) & 0b111111) << 0) ;
}
assert(0);
return 0;
}
uint32_t TextOperations::getUnicodeCodepoint(char data, const std::string & encoding )
{
std::string stringNative(1, data);
std::string stringUnicode = toUnicode(stringNative, encoding);
if (stringUnicode.empty())
return 0;
return getUnicodeCodepoint(stringUnicode.data(), stringUnicode.size());
}
std::string TextOperations::toUnicode(const std::string &text, const std::string &encoding)
{
return boost::locale::conv::to_utf<char>(text, encoding);