diff --git a/head/schema-dart/test/inputs/dart/unicode-codepoint-length.schema/default/TopLevel.dart b/head/schema-dart/test/inputs/dart/unicode-codepoint-length.schema/default/TopLevel.dart
new file mode 100644
index 0000000..8e891ab
--- /dev/null
+++ b/head/schema-dart/test/inputs/dart/unicode-codepoint-length.schema/default/TopLevel.dart
@@ -0,0 +1,33 @@
+// To parse this JSON data, do
+//
+//     final topLevel = topLevelFromJson(jsonString);
+
+import 'dart:convert';
+
+TopLevel topLevelFromJson(String str) => TopLevel.fromJson(json.decode(str));
+
+String topLevelToJson(TopLevel data) => json.encode(data.toJson());
+
+class TopLevel {
+    final String exact;
+    final String maximum;
+    final String minimum;
+
+    TopLevel({
+        required this.exact,
+        required this.maximum,
+        required this.minimum,
+    });
+
+    factory TopLevel.fromJson(Map<String, dynamic> json) => TopLevel(
+        exact: ((x) => RegExp("^[^!]+\u0024").hasMatch(x) ? x : throw FormatException("Expected matching string"))(((x) => x.runes.length >= 2 && x.runes.length <= 2 ? x : throw FormatException("Expected bounded string"))(json["exact"])),
+        maximum: ((x) => true && x.runes.length <= 1 ? x : throw FormatException("Expected bounded string"))(json["maximum"]),
+        minimum: ((x) => x.runes.length >= 2 && true ? x : throw FormatException("Expected bounded string"))(json["minimum"]),
+    );
+
+    Map<String, dynamic> toJson() => {
+        "exact": exact,
+        "maximum": maximum,
+        "minimum": minimum,
+    };
+}
diff --git a/base/schema-dart/test/inputs/schema/minmaxlength.schema/default/TopLevel.dart b/head/schema-dart/test/inputs/schema/minmaxlength.schema/default/TopLevel.dart
index f1634f2..aaf220c 100644
--- a/base/schema-dart/test/inputs/schema/minmaxlength.schema/default/TopLevel.dart
+++ b/head/schema-dart/test/inputs/schema/minmaxlength.schema/default/TopLevel.dart
@@ -30,14 +30,14 @@ class TopLevel {
     });
 
     factory TopLevel.fromJson(Map<String, dynamic> json) => TopLevel(
-        intersection: ((x) => x.length >= 4 && x.length <= 5 ? x : throw FormatException("Expected bounded string"))(json["intersection"]),
+        intersection: ((x) => x.runes.length >= 4 && x.runes.length <= 5 ? x : throw FormatException("Expected bounded string"))(json["intersection"]),
         inUnion: json["inUnion"],
-        maxlength: ((x) => true && x.length <= 5 ? x : throw FormatException("Expected bounded string"))(json["maxlength"]),
-        minlength: ((x) => x.length >= 3 && true ? x : throw FormatException("Expected bounded string"))(json["minlength"]),
-        minMaxIntersection: ((x) => x.length >= 3 && x.length <= 5 ? x : throw FormatException("Expected bounded string"))(json["minMaxIntersection"]),
-        minmaxlength: ((x) => x.length >= 3 && x.length <= 5 ? x : throw FormatException("Expected bounded string"))(json["minmaxlength"]),
+        maxlength: ((x) => true && x.runes.length <= 5 ? x : throw FormatException("Expected bounded string"))(json["maxlength"]),
+        minlength: ((x) => x.runes.length >= 3 && true ? x : throw FormatException("Expected bounded string"))(json["minlength"]),
+        minMaxIntersection: ((x) => x.runes.length >= 3 && x.runes.length <= 5 ? x : throw FormatException("Expected bounded string"))(json["minMaxIntersection"]),
+        minmaxlength: ((x) => x.runes.length >= 3 && x.runes.length <= 5 ? x : throw FormatException("Expected bounded string"))(json["minmaxlength"]),
         minMaxUnion: json["minMaxUnion"],
-        union: ((x) => x.length >= 3 && x.length <= 6 ? x : throw FormatException("Expected bounded string"))(json["union"]),
+        union: ((x) => x.runes.length >= 3 && x.runes.length <= 6 ? x : throw FormatException("Expected bounded string"))(json["union"]),
     );
 
     Map<String, dynamic> toJson() => {
diff --git a/base/schema-dart/test/inputs/schema/optional-const-ref.schema/default/TopLevel.dart b/head/schema-dart/test/inputs/schema/optional-const-ref.schema/default/TopLevel.dart
index 47f7b1d..ca79572 100644
--- a/base/schema-dart/test/inputs/schema/optional-const-ref.schema/default/TopLevel.dart
+++ b/head/schema-dart/test/inputs/schema/optional-const-ref.schema/default/TopLevel.dart
@@ -30,10 +30,10 @@ class TopLevel {
     factory TopLevel.fromJson(Map<String, dynamic> json) => TopLevel(
         coordinates: json["coordinates"] == null ? null : List<Coordinate>.from(json["coordinates"]!.map((x) => Coordinate.fromJson(x))),
         count: json["count"] == null ? null : ((x) => x >= 1 && x <= 100 ? x : throw FormatException("Expected bounded number"))(json["count"]),
-        label: json["label"] == null ? null : ((x) => x.length >= 2 && x.length <= 16 ? x : throw FormatException("Expected bounded string"))(json["label"]),
+        label: json["label"] == null ? null : ((x) => x.runes.length >= 2 && x.runes.length <= 16 ? x : throw FormatException("Expected bounded string"))(json["label"]),
         requiredCoordinates: List<Coordinate>.from(json["requiredCoordinates"].map((x) => Coordinate.fromJson(x))),
         requiredCount: ((x) => x >= 1 && x <= 100 ? x : throw FormatException("Expected bounded number"))(json["requiredCount"]),
-        requiredLabel: ((x) => x.length >= 2 && x.length <= 16 ? x : throw FormatException("Expected bounded string"))(json["requiredLabel"]),
+        requiredLabel: ((x) => x.runes.length >= 2 && x.runes.length <= 16 ? x : throw FormatException("Expected bounded string"))(json["requiredLabel"]),
         weight: json["weight"]?.toDouble() == null ? null : ((x) => x >= 0.5 && x <= 99.5 ? x : throw FormatException("Expected bounded number"))(json["weight"]?.toDouble()),
     );
 
diff --git a/base/schema-dart/test/inputs/schema/optional-constraints.schema/default/TopLevel.dart b/head/schema-dart/test/inputs/schema/optional-constraints.schema/default/TopLevel.dart
index 3163740..1111bcb 100644
--- a/base/schema-dart/test/inputs/schema/optional-constraints.schema/default/TopLevel.dart
+++ b/head/schema-dart/test/inputs/schema/optional-constraints.schema/default/TopLevel.dart
@@ -27,7 +27,7 @@ class TopLevel {
         optDouble: json["optDouble"]?.toDouble() == null ? null : ((x) => x >= 0.5 && x <= 99.5 ? x : throw FormatException("Expected bounded number"))(json["optDouble"]?.toDouble()),
         optInt: json["optInt"] == null ? null : ((x) => x >= 0 && x <= 100 ? x : throw FormatException("Expected bounded number"))(json["optInt"]),
         optPattern: json["optPattern"] == null ? null : ((x) => RegExp("^[a-z]+\u0024").hasMatch(x) ? x : throw FormatException("Expected matching string"))(json["optPattern"]),
-        optString: json["optString"] == null ? null : ((x) => x.length >= 3 && x.length <= 10 ? x : throw FormatException("Expected bounded string"))(json["optString"]),
+        optString: json["optString"] == null ? null : ((x) => x.runes.length >= 3 && x.runes.length <= 10 ? x : throw FormatException("Expected bounded string"))(json["optString"]),
         reqZeroMin: ((x) => x >= 0 && x <= 100 ? x : throw FormatException("Expected bounded number"))(json["reqZeroMin"]),
     );
 
diff --git a/base/schema-dart/test/inputs/schema/renaming-bug.schema/default/TopLevel.dart b/head/schema-dart/test/inputs/schema/renaming-bug.schema/default/TopLevel.dart
index 08e123e..660c8ca 100644
--- a/base/schema-dart/test/inputs/schema/renaming-bug.schema/default/TopLevel.dart
+++ b/head/schema-dart/test/inputs/schema/renaming-bug.schema/default/TopLevel.dart
@@ -69,7 +69,7 @@ class Berry {
 
     factory Berry.fromJson(Map<String, dynamic> json) => Berry(
         color: json["color"] == null ? null : Color.fromJson(json["color"]),
-        name: json["name"] == null ? null : ((x) => x.length >= 1 && true ? x : throw FormatException("Expected bounded string"))(json["name"]),
+        name: json["name"] == null ? null : ((x) => x.runes.length >= 1 && true ? x : throw FormatException("Expected bounded string"))(json["name"]),
         shapes: json["shapes"] == null ? null : List<Shape>.from(json["shapes"]!.map((x) => Shape.fromJson(x))),
     );
 
@@ -227,7 +227,7 @@ class Vehicle {
 
     factory Vehicle.fromJson(Map<String, dynamic> json) => Vehicle(
         brand: json["brand"],
-        id: json["id"] == null ? null : ((x) => x.length >= 1 && true ? x : throw FormatException("Expected bounded string"))(json["id"]),
+        id: json["id"] == null ? null : ((x) => x.runes.length >= 1 && true ? x : throw FormatException("Expected bounded string"))(json["id"]),
         speed: json["speed"] == null ? null : Speed.fromJson(json["speed"]),
         subModule: json["subModule"],
         type: json["type"] == null ? null : VehicleType.fromJson(json["type"]),
diff --git a/base/schema-dart/test/inputs/schema/schema-constraints.schema/default/TopLevel.dart b/head/schema-dart/test/inputs/schema/schema-constraints.schema/default/TopLevel.dart
index 01d92d0..3efdf2e 100644
--- a/base/schema-dart/test/inputs/schema/schema-constraints.schema/default/TopLevel.dart
+++ b/head/schema-dart/test/inputs/schema/schema-constraints.schema/default/TopLevel.dart
@@ -18,7 +18,7 @@ class TopLevel {
     });
 
     factory TopLevel.fromJson(Map<String, dynamic> json) => TopLevel(
-        minMaxLength: ((x) => x.length >= 5 && x.length <= 5 ? x : throw FormatException("Expected bounded string"))(json["minMaxLength"]),
+        minMaxLength: ((x) => x.runes.length >= 5 && x.runes.length <= 5 ? x : throw FormatException("Expected bounded string"))(json["minMaxLength"]),
         percent: ((x) => x >= 0 && x <= 1 ? x : throw FormatException("Expected bounded number"))(json["percent"]?.toDouble()),
     );
 
