feat: add raw byte access methods and \x escape to String class

Add `byteAt(index)`, `codePointAt(index)`, and `bytes` sequence to String,
enabling direct byte-level manipulation of UTF-8 encoded strings. Introduce
`\x` hex escape sequence in string literals for specifying raw byte values.
Refactor Unicode escape parsing into a generic `readHexEscape` function
supporting variable digit counts. Implement `wrenUtf8Decode` utility for
decoding UTF-8 sequences from byte buffers. Add comprehensive tests for
`byteAt` including boundary conditions and error cases.
This commit is contained in:
Bob Nystrom
2015-03-28 03:44:07 +00:00
parent b7904a89c9
commit c3d0b66630
36 changed files with 402 additions and 15 deletions
+17 -3
View File
@@ -30,8 +30,12 @@ Numbers are instances of the [Num](core/num.html) class.
## Strings
Strings are chunks of text stored as UTF-8. Their class is
[String](core/string.html). String literals are surrounded in double quotes:
A string is an array of bytes. Typically, they store characters encoded in
UTF-8, but you can put any byte values in there, even zero or invalid UTF-8
sequences. (You might have some trouble *printing* the latter to your terminal,
though.)
String literals are surrounded in double quotes:
:::dart
"hi there"
@@ -39,6 +43,7 @@ Strings are chunks of text stored as UTF-8. Their class is
A handful of escape characters are supported:
:::dart
"\0" // The NUL byte: 0.
"\"" // A double quote character.
"\\" // A backslash.
"\a" // Alarm beep. (Who uses this?)
@@ -49,7 +54,16 @@ A handful of escape characters are supported:
"\t" // Tab.
"\v" // Vertical tab.
A `\u` followed by four hex digits can be used to specify a Unicode code point.
A `\u` followed by four hex digits can be used to specify a Unicode code point:
:::dart
IO.print("\u0041\u0b83\u00DE") // "AஃÞ"
A `\x` followed by two hex digits specifies a single unencoded byte:
IO.print("\x48\x69\x2e") // "Hi."
Strings are objects of class [String](core/string.html).
## Ranges