diff --git a/ts/byte-buffer.ts b/ts/byte-buffer.ts
index bb77f3b..09c55ad 100644
--- a/ts/byte-buffer.ts
+++ b/ts/byte-buffer.ts
@@ -5,6 +5,7 @@
 
 export class ByteBuffer {
     private position_ = 0;
+    private text_decoder_ = new TextDecoder();
   
     /**
      * Create a new ByteBuffer with a given array of bytes (`Uint8Array`)
@@ -187,70 +188,22 @@
      * Create a JavaScript string from UTF-8 data stored inside the FlatBuffer.
      * This allocates a new string and converts to wide chars upon each access.
      *
-     * To avoid the conversion to UTF-16, pass Encoding.UTF8_BYTES as
-     * the "optionalEncoding" argument. This is useful for avoiding conversion to
-     * and from UTF-16 when the data will just be packaged back up in another
-     * FlatBuffer later on.
+     * To avoid the conversion to string, pass Encoding.UTF8_BYTES as the
+     * "optionalEncoding" argument. This is useful for avoiding conversion when
+     * the data will just be packaged back up in another FlatBuffer later on.
      *
      * @param offset
      * @param opt_encoding Defaults to UTF16_STRING
      */
     __string(offset: number, opt_encoding?: Encoding): string | Uint8Array {
       offset += this.readInt32(offset);
-  
       const length = this.readInt32(offset);
-      let result = '';
-      let i = 0;
-  
       offset += SIZEOF_INT;
-  
-      if (opt_encoding === Encoding.UTF8_BYTES) {
-        return this.bytes_.subarray(offset, offset + length);
-      }
-  
-      while (i < length) {
-        let codePoint;
-  
-        // Decode UTF-8
-        const a = this.readUint8(offset + i++);
-        if (a < 0xC0) {
-          codePoint = a;
-        } else {
-          const b = this.readUint8(offset + i++);
-          if (a < 0xE0) {
-            codePoint =
-              ((a & 0x1F) << 6) |
-              (b & 0x3F);
-          } else {
-            const c = this.readUint8(offset + i++);
-            if (a < 0xF0) {
-              codePoint =
-                ((a & 0x0F) << 12) |
-                ((b & 0x3F) << 6) |
-                (c & 0x3F);
-            } else {
-              const d = this.readUint8(offset + i++);
-              codePoint =
-                ((a & 0x07) << 18) |
-                ((b & 0x3F) << 12) |
-                ((c & 0x3F) << 6) |
-                (d & 0x3F);
-            }
-          }
-        }
-  
-        // Encode UTF-16
-        if (codePoint < 0x10000) {
-          result += String.fromCharCode(codePoint);
-        } else {
-          codePoint -= 0x10000;
-          result += String.fromCharCode(
-            (codePoint >> 10) + 0xD800,
-            (codePoint & ((1 << 10) - 1)) + 0xDC00);
-        }
-      }
-  
-      return result;
+      const utf8bytes = this.bytes_.subarray(offset, offset + length);
+      if (opt_encoding === Encoding.UTF8_BYTES)
+        return utf8bytes;
+      else
+        return this.text_decoder_.decode(utf8bytes);
     }
   
     /**
