diff --git a/regex-generator.cabal b/regex-generator.cabal
--- a/regex-generator.cabal
+++ b/regex-generator.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                regex-generator
-version:             0.1.0.2
+version:             0.1.0.3
 synopsis:            Generate a random string from a PCRE
 description:         The regex-generator library allows generating bytestrings
                      from PCREs. See github.com/protoben/regex-generator-hs for
diff --git a/src/Text/Regex/Regen/Parse.hs b/src/Text/Regex/Regen/Parse.hs
--- a/src/Text/Regex/Regen/Parse.hs
+++ b/src/Text/Regex/Regen/Parse.hs
@@ -251,12 +251,12 @@
     , () <$ string "NO_AUTO_POSSESS"
     , () <$ string "NO_START_OPT"
     , () <$ string "BSR_ANYCRLF"
-    , string "BSR_UNICODE" >>  noUnicode
-    , string "UTF8"        >>  noUnicode
-    , string "UTF16"       >>  noUnicode
-    , string "UTF32"       >>  noUnicode
-    , string "UTF"         >>  noUnicode
-    , string "UCP"         >>  noUnicode
+    , () <$ string "UTF8"
+    , string "BSR_UNICODE" >>  eNotSupported "unicode"
+    , string "UTF16"       >>  eNotSupported "utf16"
+    , string "UTF32"       >>  eNotSupported "utf32"
+    , string "UTF"         >>  eNotSupported "unicode"
+    , string "UCP"         >>  eNotSupported "unicode"
     , string "CRLF"        >>  noCRLF
     , string "ANYCRLF"     >>  setLineEnds AnyCRLF
     , string "ANY"         >>  setLineEnds Any
@@ -266,7 +266,6 @@
     ]
     where
     eBadOpt s = eParserError $ "bad global option: " ++ show s
-    noUnicode = eNotSupported "unicode"
     noCRLF    = eNotSupported "crlf line ends"
 
 localOption :: ParserST ()
diff --git a/src/Text/Regex/Regen/ParserST.hs b/src/Text/Regex/Regen/ParserST.hs
--- a/src/Text/Regex/Regen/ParserST.hs
+++ b/src/Text/Regex/Regen/ParserST.hs
@@ -180,7 +180,7 @@
 letter = lift P.letter_ascii
 
 hexByte :: ParserST Char
-hexByte = inRange $ char 'x' *> (byte' <|> braced byte' <|> pure '\0')
+hexByte = char 'x' *> (byte' <|> braced byte' <|> pure '\0')
     where
     byte'      = byte2 <|> byte1
     byte2      = decode <$> hexDigit <*> hexDigit
@@ -192,7 +192,7 @@
     hexDigitAZ = (\c -> ord c - ord 'A' + 0xA) <$> cInRange 'A' 'Z'
 
 octalByte :: ParserST Char
-octalByte = inRange $ byte' <|> char 'o' *> (braced byte' <|> eMissingBrace)
+octalByte = byte' <|> char 'o' *> (braced byte' <|> eMissingBrace)
     where
     octDigit      = (\c -> ord c - ord '0') <$> cInRange '0' '7'
     byte'         = byte3 <|> byte2 <|> byte1
@@ -201,21 +201,6 @@
     byte1         = decode <$> pure 0   <*> pure 0   <*> octDigit
     decode a b c  = chr $ (a * 64) + (b * 8) + c
     eMissingBrace = eParserError "missing '{' after '\\o'"
-
-inRange :: ParserST Char -> ParserST Char
-inRange p = p >>= \c ->
-    if '\x00' <= c && c <= '\x7f'
-        then pure c
-        else eParserError
-            $ showString "octal and hex escapes must be in range "
-            $ showRange '\x00' '\x7f' ""
-    where
-    showHex'  c   = showString "0x" . zeroPad 2 (showHex (ord c) "")
-    showOct'  c   = zeroPad 3 $ showOct (ord c) ""
-    zeroPad   n s = showString (replicate (n - length s) '0') . showString s
-    showHexR  c d = showHex' c . showString "-" . showHex' d
-    showOctR  c d = showOct' c . showString "-" . showOct' d
-    showRange c d = showHexR c d . showString " (" . showOctR c d . showString ")"
 
 cescape :: ParserST Char
 cescape = choice
diff --git a/test/Gen.hs b/test/Gen.hs
--- a/test/Gen.hs
+++ b/test/Gen.hs
@@ -54,10 +54,6 @@
     it "accepts whitespace escape"  $ shouldGen "\\R"
     it "accepts C escapes"          $ shouldGen "\\a\\n\\f\\t"
     it "accepts escaped specials"   $ shouldGen "\\[\\(\\|\\$\\^\\.\\*"
-    it "rejects out-of-range hex escapes" $
-        generate "\\x80" `shouldThrow` isEParserError
-    it "rejects out-of-range octal escapes" $
-        generate "\\200" `shouldThrow` isEParserError
     it "rejects '\\C'" $
         generate "\\C" `shouldThrow` isENotSupported
     it "rejects '\\X'" $
@@ -230,6 +226,7 @@
     it "ignores 'NO_AUTO_POSSESS'"  $ shouldGen "(*NO_AUTO_POSSESS)foo"
     it "ignores 'NO_START_OPT'"     $ shouldGen "(*NO_START_OPT)foo"
     it "ignores 'BSR_ANYCRLF'"      $ shouldGen "(*BSR_ANYCRLF)foo"
+    it "allows 'UTF8'"              $ shouldGen "(*UTF8)foo"
     it "allows 'LF'"                $ shouldGen "(*LF)foo"
     it "allows 'CR'"                $ shouldGen "(*CR)foo"
     it "allows 'ANY'"               $ shouldGen "(*ANY)foo"
@@ -238,8 +235,6 @@
         generate "(*CRLF)foo" `shouldThrow` isENotSupported
     it "rejects 'BSR_UNICODE'" $
         generate "(*BSR_UNICODE)foo" `shouldThrow` isENotSupported
-    it "rejects 'UTF8'" $
-        generate "(*UTF8)foo" `shouldThrow` isENotSupported
     it "rejects 'UTF16'" $
         generate "(*UTF16)foo" `shouldThrow` isENotSupported
     it "rejects 'UTF32'" $
