Fix Uncode server API
This commit is contained in:
@@ -18,6 +18,15 @@ std::timed_mutex timeImageMutex;
|
||||
|
||||
namespace ANSCENTER
|
||||
{
|
||||
// Helper: detect if a std::string is actually UTF-16LE (e.g. from LabVIEW).
|
||||
// Heuristic: length >= 4, even, and first printable ASCII char is followed by 0x00.
|
||||
static bool IsLikelyUTF16LE(const std::string& str) {
|
||||
if (str.size() < 4 || (str.size() % 2 != 0)) return false;
|
||||
unsigned char b0 = static_cast<unsigned char>(str[0]);
|
||||
unsigned char b1 = static_cast<unsigned char>(str[1]);
|
||||
return (b0 >= 0x20 && b0 <= 0x7E && b1 == 0x00);
|
||||
}
|
||||
|
||||
static void VerifyGlobalANSUltilityLicense(const std::string& licenseKey) {
|
||||
try {
|
||||
static const std::vector<std::pair<int, std::string>> licenseChecks = {
|
||||
@@ -1148,9 +1157,9 @@ namespace ANSCENTER
|
||||
for (int i = offset; i + 1 < endPos; i += 2) {
|
||||
uint16_t codepoint = static_cast<unsigned char>(utf16leBytes[i])
|
||||
| (static_cast<unsigned char>(utf16leBytes[i + 1]) << 8);
|
||||
// Pass through printable ASCII including space (0x20-0x7E)
|
||||
// Escape control characters and non-ASCII as \uXXXX
|
||||
if (codepoint >= 0x20 && codepoint <= 0x7E) {
|
||||
// Pass through printable ASCII (0x20-0x7E) and common whitespace (tab, LF, CR)
|
||||
// Escape other control characters and non-ASCII as \uXXXX
|
||||
if ((codepoint >= 0x20 && codepoint <= 0x7E) || codepoint == 0x09 || codepoint == 0x0A || codepoint == 0x0D) {
|
||||
result += static_cast<char>(codepoint);
|
||||
} else {
|
||||
char buf[7];
|
||||
@@ -1163,17 +1172,22 @@ namespace ANSCENTER
|
||||
|
||||
std::string ANSUtilities::ConvertUTF8ToUnicodeEscapes(const std::string& utf8Str) {
|
||||
if (utf8Str.empty()) return "";
|
||||
// Auto-detect UTF-16LE input (LabVIEW may pass UTF-16LE strings)
|
||||
if (IsLikelyUTF16LE(utf8Str)) {
|
||||
std::string asUtf8 = ConvertUTF16LEToUTF8(utf8Str.data(), static_cast<int>(utf8Str.size()));
|
||||
return ConvertUTF8ToUnicodeEscapes(asUtf8);
|
||||
}
|
||||
std::string result;
|
||||
result.reserve(utf8Str.size() * 2);
|
||||
size_t i = 0;
|
||||
while (i < utf8Str.size()) {
|
||||
unsigned char c = static_cast<unsigned char>(utf8Str[i]);
|
||||
if (c >= 0x20 && c <= 0x7E) {
|
||||
// Printable ASCII including space (0x20-0x7E) — pass through as-is
|
||||
if ((c >= 0x20 && c <= 0x7E) || c == '\t' || c == '\n' || c == '\r') {
|
||||
// Printable ASCII (0x20-0x7E) and common whitespace (tab, LF, CR) — pass through
|
||||
result += utf8Str[i];
|
||||
i++;
|
||||
} else if (c <= 0x7F) {
|
||||
// Control chars (0x00-0x1F), DEL (0x7F) — escape as \uXXXX
|
||||
// Other control chars (0x00-0x08, 0x0B, 0x0C, 0x0E-0x1F), DEL (0x7F) — escape as \uXXXX
|
||||
char buf[7];
|
||||
snprintf(buf, sizeof(buf), "\\u%04x", c);
|
||||
result += buf;
|
||||
@@ -1239,6 +1253,11 @@ namespace ANSCENTER
|
||||
|
||||
std::string ANSUtilities::DoubleEscapeUnicode(const std::string& str) {
|
||||
if (str.empty()) return "";
|
||||
// Auto-detect UTF-16LE input (LabVIEW may pass UTF-16LE strings)
|
||||
if (IsLikelyUTF16LE(str)) {
|
||||
std::string asUtf8 = ConvertUTF16LEToUTF8(str.data(), static_cast<int>(str.size()));
|
||||
return DoubleEscapeUnicode(asUtf8);
|
||||
}
|
||||
std::string result;
|
||||
result.reserve(str.size() + str.size() / 4);
|
||||
for (size_t i = 0; i < str.size(); i++) {
|
||||
@@ -1253,11 +1272,21 @@ namespace ANSCENTER
|
||||
}
|
||||
|
||||
std::string ANSUtilities::ConvertUTF8ToDoubleEscapedUnicode(const std::string& utf8Str) {
|
||||
return DoubleEscapeUnicode(ConvertUTF8ToUnicodeEscapes(utf8Str));
|
||||
if (utf8Str.empty()) return "";
|
||||
// Auto-detect UTF-16LE input (LabVIEW may pass UTF-16LE strings)
|
||||
std::string inputStr = IsLikelyUTF16LE(utf8Str)
|
||||
? ConvertUTF16LEToUTF8(utf8Str.data(), static_cast<int>(utf8Str.size()))
|
||||
: utf8Str;
|
||||
return DoubleEscapeUnicode(ConvertUTF8ToUnicodeEscapes(inputStr));
|
||||
}
|
||||
|
||||
std::string ANSUtilities::UnescapeDoubleEscapedUnicode(const std::string& str) {
|
||||
if (str.empty()) return "";
|
||||
// Auto-detect UTF-16LE input (LabVIEW may pass UTF-16LE strings)
|
||||
if (IsLikelyUTF16LE(str)) {
|
||||
std::string asUtf8 = ConvertUTF16LEToUTF8(str.data(), static_cast<int>(str.size()));
|
||||
return UnescapeDoubleEscapedUnicode(asUtf8);
|
||||
}
|
||||
// Quick scan: if no \\u pattern exists, return original string unchanged
|
||||
bool found = false;
|
||||
for (size_t i = 0; i + 2 < str.size(); i++) {
|
||||
|
||||
Reference in New Issue
Block a user