diff --git a/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp b/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
index e6b7a2b..813c31e 100644
--- a/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
+++ b/fxbarcode/datamatrix/BC_ASCIIEncoder.cpp
@@ -27,71 +27,81 @@
 #include "fxbarcode/datamatrix/BC_HighLevelEncoder.h"
 #include "fxbarcode/datamatrix/BC_SymbolInfo.h"
 #include "fxbarcode/utils.h"
+#include "third_party/base/optional.h"
+
+namespace {
+
+Optional<wchar_t> EncodeASCIIDigits(wchar_t digit1, wchar_t digit2) {
+  if (!CBC_HighLevelEncoder::isDigit(digit1) ||
+      !CBC_HighLevelEncoder::isDigit(digit2)) {
+    // This could potentially return 0 as a sentinel value. Then this function
+    // can just return wchar_t instead of Optional<wchar_t>.
+    return {};
+  }
+  return static_cast<wchar_t>((digit1 - 48) * 10 + (digit2 - 48) + 130);
+}
+
+}  // namespace
 
 CBC_ASCIIEncoder::CBC_ASCIIEncoder() {}
+
 CBC_ASCIIEncoder::~CBC_ASCIIEncoder() {}
+
 int32_t CBC_ASCIIEncoder::getEncodingMode() {
   return ASCII_ENCODATION;
 }
+
 void CBC_ASCIIEncoder::Encode(CBC_EncoderContext& context, int32_t& e) {
   int32_t n = CBC_HighLevelEncoder::determineConsecutiveDigitCount(
       context.m_msg, context.m_pos);
   if (n >= 2) {
-    wchar_t code = encodeASCIIDigits(context.m_msg[context.m_pos],
-                                     context.m_msg[context.m_pos + 1], e);
-    if (e != BCExceptionNO) {
+    Optional<wchar_t> code = EncodeASCIIDigits(
+        context.m_msg[context.m_pos], context.m_msg[context.m_pos + 1]);
+    if (!code) {
+      e = BCExceptionGeneric;
       return;
     }
-    context.writeCodeword(code);
+    context.writeCodeword(*code);
     context.m_pos += 2;
-  } else {
-    wchar_t c = context.getCurrentChar();
-    int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
-        context.m_msg, context.m_pos, getEncodingMode());
-    if (newMode != getEncodingMode()) {
-      switch (newMode) {
-        case BASE256_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_BASE256);
-          context.signalEncoderChange(BASE256_ENCODATION);
-          return;
-        case C40_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_C40);
-          context.signalEncoderChange(C40_ENCODATION);
-          return;
-        case X12_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_ANSIX12);
-          context.signalEncoderChange(X12_ENCODATION);
-          break;
-        case TEXT_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_TEXT);
-          context.signalEncoderChange(TEXT_ENCODATION);
-          break;
-        case EDIFACT_ENCODATION:
-          context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_EDIFACT);
-          context.signalEncoderChange(EDIFACT_ENCODATION);
-          break;
-        default:
-          e = BCExceptionIllegalStateIllegalMode;
-          return;
-      }
-    } else if (CBC_HighLevelEncoder::isExtendedASCII(c)) {
-      context.writeCodeword(CBC_HighLevelEncoder::UPPER_SHIFT);
-      context.writeCodeword((wchar_t)(c - 128 + 1));
-      context.m_pos++;
-    } else {
-      context.writeCodeword((wchar_t)(c + 1));
-      context.m_pos++;
+    return;
+  }
+
+  wchar_t c = context.getCurrentChar();
+  int32_t newMode = CBC_HighLevelEncoder::lookAheadTest(
+      context.m_msg, context.m_pos, getEncodingMode());
+  if (newMode != getEncodingMode()) {
+    switch (newMode) {
+      case BASE256_ENCODATION:
+        context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_BASE256);
+        context.signalEncoderChange(BASE256_ENCODATION);
+        return;
+      case C40_ENCODATION:
+        context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_C40);
+        context.signalEncoderChange(C40_ENCODATION);
+        return;
+      case X12_ENCODATION:
+        context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_ANSIX12);
+        context.signalEncoderChange(X12_ENCODATION);
+        return;
+      case TEXT_ENCODATION:
+        context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_TEXT);
+        context.signalEncoderChange(TEXT_ENCODATION);
+        return;
+      case EDIFACT_ENCODATION:
+        context.writeCodeword(CBC_HighLevelEncoder::LATCH_TO_EDIFACT);
+        context.signalEncoderChange(EDIFACT_ENCODATION);
+        return;
+      default:
+        e = BCExceptionGeneric;
+        return;
     }
   }
-}
-wchar_t CBC_ASCIIEncoder::encodeASCIIDigits(wchar_t digit1,
-                                            wchar_t digit2,
-                                            int32_t& e) {
-  if (CBC_HighLevelEncoder::isDigit(digit1) &&
-      CBC_HighLevelEncoder::isDigit(digit2)) {
-    int32_t num = (digit1 - 48) * 10 + (digit2 - 48);
-    return (wchar_t)(num + 130);
+
+  if (CBC_HighLevelEncoder::isExtendedASCII(c)) {
+    context.writeCodeword(CBC_HighLevelEncoder::UPPER_SHIFT);
+    context.writeCodeword(static_cast<wchar_t>(c - 128 + 1));
+  } else {
+    context.writeCodeword(static_cast<wchar_t>(c + 1));
   }
-  e = BCExceptionIllegalArgumentNotGigits;
-  return 0;
+  context.m_pos++;
 }
diff --git a/fxbarcode/datamatrix/BC_ASCIIEncoder.h b/fxbarcode/datamatrix/BC_ASCIIEncoder.h
index 6eb3a50..35d4c5f 100644
--- a/fxbarcode/datamatrix/BC_ASCIIEncoder.h
+++ b/fxbarcode/datamatrix/BC_ASCIIEncoder.h
@@ -19,9 +19,6 @@
   // CBC_Encoder
   int32_t getEncodingMode() override;
   void Encode(CBC_EncoderContext& context, int32_t& e) override;
-
- private:
-  static wchar_t encodeASCIIDigits(wchar_t digit1, wchar_t digit2, int32_t& e);
 };
 
 #endif  // FXBARCODE_DATAMATRIX_BC_ASCIIENCODER_H_
diff --git a/fxbarcode/utils.h b/fxbarcode/utils.h
index 2303af4..a806029 100644
--- a/fxbarcode/utils.h
+++ b/fxbarcode/utils.h
@@ -62,8 +62,6 @@
 #define BCExceptionIllegalDataCodewords 88
 #define BCExceptionIllegalStateUnexpectedCase 90
 #define BCExceptionIllegalStateMessageLengthInvalid 92
-#define BCExceptionIllegalArgumentNotGigits 93
-#define BCExceptionIllegalStateIllegalMode 94
 #define BCExceptionNonEncodableCharacterDetected 96
 #define BCExceptionGeneric 107
 
