30 unsigned char uc =
static_cast<unsigned char>(c);
33 if ((uc&0xE0u)==0xC0u)
37 if ((uc&0xF0u)==0xE0u)
41 if ((uc&0xF8u)==0xF0u)
45 if ((uc&0xFCu)==0xF8u)
49 if ((uc&0xFEu)==0xFCu)
59static inline uint32_t
decode_utf8(
const char* data ,
int numBytes )
noexcept
61 uint32_t cp =
static_cast<unsigned char>(*data);
64 cp &= 0x7F >> numBytes;
65 for (
int i=1 ; i<numBytes ; i++)
67 cp = (cp<<6) | (static_cast<unsigned char>(data[i])&0x3F);
75 if (s==
nullptr || bytesLeft==0)
80 unsigned char uc =
static_cast<unsigned char>(*s);
89 if ((uc&0xFEu)==0xFCu)
96 if ((uc&0xFCu)==0xF8u)
103 if ((uc&0xF8u)==0xF0u)
110 if ((uc&0xF0u)==0xE0u)
117 if ((uc&0xE0u)==0xC0u)
133 if (input.length()<=pos)
return std::string();
135 if (input.length()<pos+numBytes)
return std::string();
136 return input.substr(pos,numBytes);
148 return code>=
'A' && code<='Z' ? static_cast<char>(code+
'a'-
'A') :
static_cast<char>(code);
153 return code>=
'a' && code<='z' ? static_cast<char>(code+
'A'-
'a') :
static_cast<char>(code);
157 char (*asciiConversionFunc)(uint32_t code),
158 const char *(*conversionFunc)(uint32_t code))
162 result.reserve(input.length());
164 size_t bytesLeft = input.length();
165 const char *p = input.c_str();
170 char c = asciiConversionFunc(code);
175 const char *conv = conversionFunc(code);
178 result.append(p,len);
203 if (s==
nullptr)
return nullptr;
205 for (uint8_t i=0;i<len;i++)
219 return !input.empty() && (
static_cast<unsigned char>(input[input.length()-1])&0xC0)==0x80;
224 if (input.length()<=pos)
return false;
234 return (
static_cast<unsigned char>(input[0])==0xC2 &&
235 static_cast<unsigned char>(input[1])==0xA0) ? 2 : 0;
246 const char *outputEncoding =
"UTF-8";
247 if (inputEncoding==
nullptr ||
dstricmp(inputEncoding,outputEncoding)==0)
return true;
248 size_t inputSize=input.length();
249 size_t outputSize=inputSize*4;
252 if (cd==
reinterpret_cast<void *
>(-1))
257 size_t iLeft=inputSize;
258 size_t oLeft=outputSize;
259 const char *inputPtr = input.data();
260 char *outputPtr = output.
rawData();
263 outputSize-=
static_cast<int>(oLeft);
264 output.
resize(outputSize);
265 output.
at(outputSize)=
'\0';
bool isPunctuationCharacter(uint32_t code)
const char * convertUnicodeToUpper(uint32_t code)
const char * convertUnicodeToLower(uint32_t code)
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
void resize(size_t newlen)
char * rawData()
Returns a writable pointer to the data.
char & at(size_t i)
Returns a reference to the character at index i.
const std::string & str() const
Text streaming class that buffers data.
void write(const char *buf, size_t len)
Adds a array of character to the stream.
static char asciiToLower(char in)
int dstricmp(const char *s1, const char *s2)
Portable versions of functions that are platform dependent.
int portable_iconv_close(void *cd)
size_t portable_iconv(void *cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
void * portable_iconv_open(const char *tocode, const char *fromcode)
std::string convertUTF8ToUpper(const std::string &input)
Converts the input string into a upper case version, also taking into account non-ASCII characters th...
static char asciiToLower(uint32_t code)
bool isUTF8CharUpperCase(const std::string &input, size_t pos)
Returns true iff the input string at byte position pos holds an upper case character.
bool transcodeCharacterStringToUTF8(std::string &input, const char *inputEncoding)
Recodes the input string from the given input encoding to UTF8.
bool isUTF8PunctuationCharacter(uint32_t unicode)
Check if the given Unicode character represents a punctuation character.
static uint32_t decode_utf8(const char *data, int numBytes) noexcept
static uint32_t convertUTF8CharToUnicode(const char *s, size_t bytesLeft, int &len)
static char asciiToUpper(uint32_t code)
static std::string caseConvert(const std::string &input, char(*asciiConversionFunc)(uint32_t code), const char *(*conversionFunc)(uint32_t code))
uint32_t getUnicodeForUTF8CharAt(const std::string &input, size_t pos)
Returns the 32bit Unicode value matching character at byte position pos in the UTF8 encoded input.
bool lastUTF8CharIsMultibyte(const std::string &input)
Returns true iff the last character in input is a multibyte character.
int isUTF8NonBreakableSpace(const char *input)
Check if the first character pointed at by input is a non-breakable whitespace character.
std::string convertUTF8ToLower(const std::string &input)
Converts the input string into a lower case version, also taking into account non-ASCII characters th...
uint8_t getUTF8CharNumBytes(char c)
Returns the number of bytes making up a single UTF8 character given the first byte in the sequence.
std::string getUTF8CharAt(const std::string &input, size_t pos)
Returns the UTF8 character found at byte position pos in the input string.
const char * writeUTF8Char(TextStream &t, const char *s)
Writes the UTF8 character pointed to by s to stream t and returns a pointer to the next character.
Various UTF8 related helper functions.