--- a/src/nhttpd/yhttpd_core/yhook.cpp +++ b/src/nhttpd/yhttpd_core/yhook.cpp @@ -13,6 +13,46 @@ // yhttpd #include "yhook.h" #include "helper.h" + +std::string iso_8859_1_to_utf8(std::string &str) +{ + std::string strOut; + for (std::string::iterator it = str.begin(); it != str.end(); ++it) + { + uint8_t ch = *it; + if (ch < 0x80) { + strOut.push_back(ch); + } + else { + strOut.push_back(0xc0 | ch >> 6); + strOut.push_back(0x80 | (ch & 0x3f)); + } + } + return strOut; +} + +bool utf8_check_is_valid(const std::string &str) +{ + int c,i,ix,n,j; + for (i=0, ix=str.length(); i < ix; i++) + { + c = (unsigned char) str[i]; + //if (c==0x09 || c==0x0a || c==0x0d || (0x20 <= c && c <= 0x7e) ) n = 0; // is_printable_ascii + if (0x00 <= c && c <= 0x7f) n=0; // 0bbbbbbb + else if ((c & 0xE0) == 0xC0) n=1; // 110bbbbb + else if ( c==0xed && i<(ix-1) && ((unsigned char)str[i+1] & 0xa0)==0xa0) return false; //U+d800 to U+dfff + else if ((c & 0xF0) == 0xE0) n=2; // 1110bbbb + else if ((c & 0xF8) == 0xF0) n=3; // 11110bbb + //else if (($c & 0xFC) == 0xF8) n=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8 + //else if (($c & 0xFE) == 0xFC) n=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8 + else return false; + for (j=0; j