Converts a Unicode code point to a narrow string in UTF-8 encoding. code_point parameter is of type UInt32 because wchar_t may not be wide enough to contain a code point. If the code_point is not a valid Unicode code point (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted to "(Invalid Unicode 0xXXXXXXXX)".
| 1434 | // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted |
| 1435 | // to "(Invalid Unicode 0xXXXXXXXX)". |
| 1436 | std::string CodePointToUtf8(UInt32 code_point) { |
| 1437 | if (code_point > kMaxCodePoint4) { |
| 1438 | return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")"; |
| 1439 | } |
| 1440 | |
| 1441 | char str[5]; // Big enough for the largest valid code point. |
| 1442 | if (code_point <= kMaxCodePoint1) { |
| 1443 | str[1] = '\0'; |
| 1444 | str[0] = static_cast<char>(code_point); // 0xxxxxxx |
| 1445 | } else if (code_point <= kMaxCodePoint2) { |
| 1446 | str[2] = '\0'; |
| 1447 | str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx |
| 1448 | str[0] = static_cast<char>(0xC0 | code_point); // 110xxxxx |
| 1449 | } else if (code_point <= kMaxCodePoint3) { |
| 1450 | str[3] = '\0'; |
| 1451 | str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx |
| 1452 | str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx |
| 1453 | str[0] = static_cast<char>(0xE0 | code_point); // 1110xxxx |
| 1454 | } else { // code_point <= kMaxCodePoint4 |
| 1455 | str[4] = '\0'; |
| 1456 | str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx |
| 1457 | str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx |
| 1458 | str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx |
| 1459 | str[0] = static_cast<char>(0xF0 | code_point); // 11110xxx |
| 1460 | } |
| 1461 | return str; |
| 1462 | } |
| 1463 | |
| 1464 | // The following two functions only make sense if the the system |
| 1465 | // uses UTF-16 for wide string encoding. All supported systems |
no test coverage detected