mirror of
https://github.com/zint/zint
synced 2024-11-16 20:57:25 +13:00
Accept input of escaped 16-bit Unicode characters
This commit is contained in:
parent
4ddcfb3613
commit
04f6f81e68
@ -886,6 +886,7 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_
|
|||||||
int error_number;
|
int error_number;
|
||||||
int in_posn, out_posn;
|
int in_posn, out_posn;
|
||||||
int hex1, hex2;
|
int hex1, hex2;
|
||||||
|
int i, unicode;
|
||||||
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
unsigned char escaped_string[*length + 1];
|
unsigned char escaped_string[*length + 1];
|
||||||
@ -963,6 +964,35 @@ static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_
|
|||||||
case '\\': escaped_string[out_posn] = '\\';
|
case '\\': escaped_string[out_posn] = '\\';
|
||||||
in_posn += 2;
|
in_posn += 2;
|
||||||
break;
|
break;
|
||||||
|
case 'u':
|
||||||
|
if (in_posn + 6 > *length) {
|
||||||
|
strcpy(symbol->errtxt, "235: Incomplete unicode escape character in input data");
|
||||||
|
return ZINT_ERROR_INVALID_DATA;
|
||||||
|
}
|
||||||
|
unicode = 0;
|
||||||
|
for (i = 0; i < 4; i++) {
|
||||||
|
if (ctoi(input_string[in_posn + i + 2]) == -1) {
|
||||||
|
strcpy(symbol->errtxt, "236: Corrupt unicode escape character in input data");
|
||||||
|
return ZINT_ERROR_INVALID_DATA;
|
||||||
|
}
|
||||||
|
unicode = unicode << 4;
|
||||||
|
unicode += ctoi(input_string[in_posn + i + 2]);
|
||||||
|
}
|
||||||
|
if (unicode >= 0x800) {
|
||||||
|
escaped_string[out_posn] = 0xe0 + ((unicode & 0xf000) >> 12);
|
||||||
|
out_posn++;
|
||||||
|
escaped_string[out_posn] = 0x80 + ((unicode & 0x0fc0) >> 6);
|
||||||
|
out_posn++;
|
||||||
|
escaped_string[out_posn] = 0x80 + (unicode & 0x003f);
|
||||||
|
} else if (unicode >= 0x80) {
|
||||||
|
escaped_string[out_posn] = 0xc0 + ((unicode & 0x07c0) >> 6);
|
||||||
|
out_posn++;
|
||||||
|
escaped_string[out_posn] = 0x80 + (unicode & 0x003f);
|
||||||
|
} else {
|
||||||
|
escaped_string[out_posn] = unicode & 0x7f;
|
||||||
|
}
|
||||||
|
in_posn += 6;
|
||||||
|
break;
|
||||||
default: strcpy(symbol->errtxt, "234: Unrecognised escape character in input data");
|
default: strcpy(symbol->errtxt, "234: Unrecognised escape character in input data");
|
||||||
return ZINT_ERROR_INVALID_DATA;
|
return ZINT_ERROR_INVALID_DATA;
|
||||||
break;
|
break;
|
||||||
|
@ -215,6 +215,9 @@ Escape Character | ASCII Equivalent | Interpretation
|
|||||||
\\ | 0x5C | Backslash
|
\\ | 0x5C | Backslash
|
||||||
\xNN | 0xNN | Any other 8-bit character
|
\xNN | 0xNN | Any other 8-bit character
|
||||||
| | where NN is hexadecimal
|
| | where NN is hexadecimal
|
||||||
|
\uNNNN | | Any 16-bit Unicode
|
||||||
|
| | character where NNNN
|
||||||
|
| | is hexadecimal
|
||||||
--------------------------------------------------------------------
|
--------------------------------------------------------------------
|
||||||
|
|
||||||
Input data can be read directly from file using the -i switch as shown below.
|
Input data can be read directly from file using the -i switch as shown below.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user