Merge pull request #241 from avdv/fix-240
Treat unicode hex digits case-insensitively
This commit is contained in:
commit
03d3e56461
|
@ -2,6 +2,7 @@ use std::borrow::Cow;
|
||||||
use std::char;
|
use std::char;
|
||||||
use std::str;
|
use std::str;
|
||||||
use std::string;
|
use std::string;
|
||||||
|
use std::string::String as StdString;
|
||||||
|
|
||||||
use self::Token::*;
|
use self::Token::*;
|
||||||
|
|
||||||
|
@ -369,19 +370,15 @@ impl<'a> Tokenizer<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn hex(&mut self, start: usize, i: usize, len: usize) -> Result<char, Error> {
|
fn hex(&mut self, start: usize, i: usize, len: usize) -> Result<char, Error> {
|
||||||
let mut val = 0;
|
let mut buf = StdString::with_capacity(len);
|
||||||
for _ in 0..len {
|
for _ in 0..len {
|
||||||
match self.one() {
|
match self.one() {
|
||||||
Some((_, ch)) if '0' <= ch && ch <= '9' => {
|
Some((_, ch)) if ch as u32 <= 0x7F && ch.is_digit(16) => buf.push(ch),
|
||||||
val = val * 16 + (ch as u32 - '0' as u32);
|
|
||||||
}
|
|
||||||
Some((_, ch)) if 'A' <= ch && ch <= 'F' => {
|
|
||||||
val = val * 16 + (ch as u32 - 'A' as u32) + 10;
|
|
||||||
}
|
|
||||||
Some((i, ch)) => return Err(Error::InvalidHexEscape(i, ch)),
|
Some((i, ch)) => return Err(Error::InvalidHexEscape(i, ch)),
|
||||||
None => return Err(Error::UnterminatedString(start)),
|
None => return Err(Error::UnterminatedString(start)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let val = u32::from_str_radix(&buf, 16).unwrap();
|
||||||
match char::from_u32(val) {
|
match char::from_u32(val) {
|
||||||
Some(ch) => Ok(ch),
|
Some(ch) => Ok(ch),
|
||||||
None => Err(Error::InvalidEscapeValue(i, val)),
|
None => Err(Error::InvalidEscapeValue(i, val)),
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
{
|
{
|
||||||
"answer1": {"type": "string", "value": "\u000B"},
|
"answer1": {"type": "string", "value": "\u000B"},
|
||||||
"answer4": {"type": "string", "value": "\u03B4α"},
|
"answer4": {"type": "string", "value": "\u03B4α"},
|
||||||
"answer8": {"type": "string", "value": "\u03B4β"}
|
"answer8": {"type": "string", "value": "\u03B4β"},
|
||||||
|
"answer9": {"type": "string", "value": "\uc0de"},
|
||||||
|
"answer10": {"type": "string", "value": "\u03B4α"},
|
||||||
|
"answer11": {"type": "string", "value": "\uABC1"}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
answer1 = "\u000B"
|
answer1 = "\u000B"
|
||||||
answer4 = "\u03B4α"
|
answer4 = "\u03B4α"
|
||||||
answer8 = "\U000003B4β"
|
answer8 = "\U000003B4β"
|
||||||
|
answer9 = "\uc0de"
|
||||||
|
answer10 = "\u03b4α"
|
||||||
|
answer11 = "\U0000abc1"
|
||||||
|
|
Loading…
Reference in a new issue