add Encoding class
This commit is contained in:
parent
3c5a7b7341
commit
c4253078a9
62
src/core/Encoding.cc
Normal file
62
src/core/Encoding.cc
Normal file
@ -0,0 +1,62 @@
|
||||
#include "Encoding.h"
|
||||
|
||||
static inline bool
|
||||
check_continuation_bytes(const uint8_t ** buffer,
|
||||
uint8_t continuation_bytes_to_check)
|
||||
{
|
||||
for (uint8_t i = 0; i < continuation_bytes_to_check; i++)
|
||||
{
|
||||
if ((**buffer & 0xC0u) != 0x80u)
|
||||
return false;
|
||||
(*buffer)++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Encoding::Type Encoding::detect_encoding(const uint8_t * buffer, size_t length)
|
||||
{
|
||||
for (size_t i = 0u; i < length; i++)
|
||||
{
|
||||
const uint8_t c = *buffer;
|
||||
uint8_t continuation_bytes_to_check;
|
||||
if ((c & 0x80u) == 0u)
|
||||
{
|
||||
buffer++;
|
||||
continue;
|
||||
}
|
||||
else if ((c & 0xE0u) == 0xC0u)
|
||||
{
|
||||
continuation_bytes_to_check = 1u;
|
||||
}
|
||||
else if ((c & 0xF0u) == 0xE0u)
|
||||
{
|
||||
continuation_bytes_to_check = 2u;
|
||||
}
|
||||
else if ((c & 0xF8u) == 0xF0u)
|
||||
{
|
||||
continuation_bytes_to_check = 3u;
|
||||
}
|
||||
else if ((c & 0xFCu) == 0xF8u)
|
||||
{
|
||||
continuation_bytes_to_check = 4u;
|
||||
}
|
||||
else if ((c & 0xFEu) == 0xFCu)
|
||||
{
|
||||
continuation_bytes_to_check = 5u;
|
||||
}
|
||||
else
|
||||
{
|
||||
return CP_1252;
|
||||
}
|
||||
buffer++;
|
||||
if (((i + continuation_bytes_to_check) < length) &&
|
||||
check_continuation_bytes(&buffer, continuation_bytes_to_check))
|
||||
{
|
||||
i += continuation_bytes_to_check;
|
||||
continue;
|
||||
}
|
||||
return CP_1252;
|
||||
}
|
||||
|
||||
return UTF_8;
|
||||
}
|
19
src/core/Encoding.h
Normal file
19
src/core/Encoding.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef ENCODING_H
|
||||
#define ENCODING_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
class Encoding
|
||||
{
|
||||
public:
|
||||
enum Type
|
||||
{
|
||||
UTF_8,
|
||||
CP_1252,
|
||||
};
|
||||
|
||||
static Type detect_encoding(const uint8_t * buffer, size_t length);
|
||||
};
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user