mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 19:08:59 +00:00
Refactor QUtil::utf8_to_ascii
This commit is contained in:
parent
089ce5902e
commit
3ef1b77304
@ -893,20 +893,32 @@ QUtil::parse_numrange(char const* range, int max)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum encoding_e { e_utf16 };
|
enum encoding_e { e_utf16, e_ascii };
|
||||||
|
|
||||||
static
|
static
|
||||||
std::string
|
std::string
|
||||||
transcode_utf8(std::string const& utf8_val, encoding_e encoding)
|
transcode_utf8(std::string const& utf8_val, encoding_e encoding,
|
||||||
|
char unknown)
|
||||||
{
|
{
|
||||||
std::string result = "\xfe\xff";
|
std::string result;
|
||||||
|
if (encoding == e_utf16)
|
||||||
|
{
|
||||||
|
result += "\xfe\xff";
|
||||||
|
}
|
||||||
size_t len = utf8_val.length();
|
size_t len = utf8_val.length();
|
||||||
for (size_t i = 0; i < len; ++i)
|
for (size_t i = 0; i < len; ++i)
|
||||||
{
|
{
|
||||||
unsigned char ch = static_cast<unsigned char>(utf8_val.at(i));
|
unsigned char ch = static_cast<unsigned char>(utf8_val.at(i));
|
||||||
if (ch < 128)
|
if (ch < 128)
|
||||||
{
|
{
|
||||||
result += QUtil::toUTF16(ch);
|
if (encoding == e_utf16)
|
||||||
|
{
|
||||||
|
result += QUtil::toUTF16(ch);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.append(1, ch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -923,7 +935,14 @@ transcode_utf8(std::string const& utf8_val, encoding_e encoding)
|
|||||||
if (((bytes_needed > 5) || (bytes_needed < 1)) ||
|
if (((bytes_needed > 5) || (bytes_needed < 1)) ||
|
||||||
((i + bytes_needed) >= len))
|
((i + bytes_needed) >= len))
|
||||||
{
|
{
|
||||||
result += "\xff\xfd";
|
if (encoding == e_utf16)
|
||||||
|
{
|
||||||
|
result += "\xff\xfd";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.append(1, unknown);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -941,7 +960,14 @@ transcode_utf8(std::string const& utf8_val, encoding_e encoding)
|
|||||||
codepoint <<= 6;
|
codepoint <<= 6;
|
||||||
codepoint += (ch & 0x3f);
|
codepoint += (ch & 0x3f);
|
||||||
}
|
}
|
||||||
result += QUtil::toUTF16(codepoint);
|
if (encoding == e_utf16)
|
||||||
|
{
|
||||||
|
result += QUtil::toUTF16(codepoint);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.append(1, unknown);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -951,28 +977,11 @@ transcode_utf8(std::string const& utf8_val, encoding_e encoding)
|
|||||||
std::string
|
std::string
|
||||||
QUtil::utf8_to_utf16(std::string const& utf8)
|
QUtil::utf8_to_utf16(std::string const& utf8)
|
||||||
{
|
{
|
||||||
return transcode_utf8(utf8, e_utf16);
|
return transcode_utf8(utf8, e_utf16, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
QUtil::utf8_to_ascii(std::string const& utf8, char unknown_char)
|
QUtil::utf8_to_ascii(std::string const& utf8, char unknown_char)
|
||||||
{
|
{
|
||||||
std::string ascii_value;
|
return transcode_utf8(utf8, e_ascii, unknown_char);
|
||||||
for (size_t i = 0; i < utf8.length(); ++i)
|
|
||||||
{
|
|
||||||
unsigned char ch = static_cast<unsigned char>(utf8.at(i));
|
|
||||||
if (ch < 128)
|
|
||||||
{
|
|
||||||
ascii_value.append(1, ch);
|
|
||||||
}
|
|
||||||
else if ((ch & 0xc0) == 0x80)
|
|
||||||
{
|
|
||||||
// Ignore subsequent byte of UTF-8 encoded character
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ascii_value.append(1, unknown_char);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ascii_value;
|
|
||||||
}
|
}
|
||||||
|
@ -48,9 +48,9 @@ HAGOOGAMAGOOGLE: 0
|
|||||||
0x7fffffff -> ff fd
|
0x7fffffff -> ff fd
|
||||||
0x80000000 -> ff fd
|
0x80000000 -> ff fd
|
||||||
---- utf8_to_ascii
|
---- utf8_to_ascii
|
||||||
Does π have fingers?
|
¿Does π have fingers?
|
||||||
Does ? have fingers?
|
?Does ? have fingers?
|
||||||
Does * have fingers?
|
*Does * have fingers?
|
||||||
---- whoami
|
---- whoami
|
||||||
quack1
|
quack1
|
||||||
quack2
|
quack2
|
||||||
|
@ -222,7 +222,7 @@ void to_utf16_test()
|
|||||||
|
|
||||||
void utf8_to_ascii_test()
|
void utf8_to_ascii_test()
|
||||||
{
|
{
|
||||||
char const* input = "Does \317\200 have fingers?";
|
char const* input = "\302\277Does \317\200 have fingers?";
|
||||||
std::cout << input
|
std::cout << input
|
||||||
<< std::endl
|
<< std::endl
|
||||||
<< QUtil::utf8_to_ascii(input)
|
<< QUtil::utf8_to_ascii(input)
|
||||||
|
Loading…
Reference in New Issue
Block a user