diff --git a/source/Handlebars.Test/IssueTests.cs b/source/Handlebars.Test/IssueTests.cs index d7e7654b..de24f35d 100644 --- a/source/Handlebars.Test/IssueTests.cs +++ b/source/Handlebars.Test/IssueTests.cs @@ -726,6 +726,20 @@ public void UnrecognisedExpressionThrowsOutOfMemoryException() Assert.Throws(()=> Handlebars.Compile(source)); } + // Issue: https://github.com/Handlebars-Net/Handlebars.Net/issues/416 + // Non-ASCII characters not supported as the first character of a placeholder identifier + [Fact] + public void Issue416_UnicodeFirstCharacterInIdentifier() + { + var config = new HandlebarsConfiguration { TextEncoder = new HtmlEncoder() }; + var handlebars = Handlebars.Create(config); + // Japanese characters as identifiers — first char is non-ASCII + var template = handlebars.Compile("Hello {{姓}} {{名}},"); + var data = new Dictionary { { "姓", "山田" }, { "名", "太郎" } }; + var result = template(data); + Assert.Equal("Hello 山田 太郎,", result); + } + // Issue: https://github.com/Handlebars-Net/Handlebars.Net/issues/545 // Partial registered on an instance should be found during render on that same instance [Fact] diff --git a/source/Handlebars/Compiler/Lexer/Parsers/WordParser.cs b/source/Handlebars/Compiler/Lexer/Parsers/WordParser.cs index 70aaa5d6..7463f330 100644 --- a/source/Handlebars/Compiler/Lexer/Parsers/WordParser.cs +++ b/source/Handlebars/Compiler/Lexer/Parsers/WordParser.cs @@ -45,7 +45,9 @@ public override Token Parse(ExtendedStringReader reader) private static bool IsWord(ExtendedStringReader reader) { var peek = reader.Peek(); - return ValidWordStartCharacters.Contains((char) peek); + if (peek == -1) return false; + var c = (char) peek; + return ValidWordStartCharacters.Contains(c) || char.IsLetter(c); } private static string AccumulateWord(ExtendedStringReader reader)