diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+# 1.4.1.3
+
+* Support DBCS encodings in afp-dump, including EBCDIC.
+
 # 1.4.1.2
 
 * Restore "afp-dump -e" support using GHC's internal encoding.
diff --git a/OpenAFP-Utils.cabal b/OpenAFP-Utils.cabal
--- a/OpenAFP-Utils.cabal
+++ b/OpenAFP-Utils.cabal
@@ -1,5 +1,5 @@
 Name:               OpenAFP-Utils
-Version:            1.4.1.2
+Version:            1.4.1.3
 License:            PublicDomain
 License-file:       LICENSE
 Author:             Audrey Tang
@@ -27,7 +27,7 @@
 
 Executable afp-dump
     Main-is:            afp-dump.hs
-    Build-depends:      OpenAFP >= 1.4, base >= 4 && < 5, bytestring, containers, xhtml, text-locale-encoding
+    Build-depends:      OpenAFP >= 1.4, base >= 4 && < 5, bytestring, containers, xhtml, text, text-locale-encoding
     Extensions:         DeriveDataTypeable, PatternGuards
 
 Executable afp-page
diff --git a/afp-dump.hs b/afp-dump.hs
--- a/afp-dump.hs
+++ b/afp-dump.hs
@@ -1,10 +1,13 @@
 module Main where
 import Text.XHtml
 import OpenAFP hiding ((!))
+import qualified OpenAFP ((!))
 import qualified Data.Set as Set
 import qualified Data.ByteString as S
-import qualified Data.ByteString.Lazy as L
+import qualified Data.ByteString.Unsafe as S
+import qualified Data.ByteString.Internal as S
 import qualified Data.ByteString.Char8 as C
+import qualified Data.Text as T
 import Data.Text.Encoding.Locale (decodeLocale', encodeLocale')
 import System.IO (noNewlineTranslation)
 
@@ -168,15 +171,24 @@
 texts :: [N1] -> [(String, ByteString)]
 texts nstr = maybeToList $ msum [ maybe Nothing (Just . ((,) cp)) $! conv (codeName cp) | cp <- encs ]
     where
+    {-
     conv c@"ibm-937"
         | (even $ length nstr)  = convert' c "UTF-8" (packNStr $ toNStr (0x0E : nstr))
         | otherwise             = Nothing
+    -}
     conv c = convert' c "UTF-8" (packNStr $ toNStr nstr)
     codeName c
         | isJust $ find (not . isDigit) c   = c
         | otherwise                         = "ibm-" ++ c
 
 {-# NOINLINE convert' #-}
+convert' "ibm-835" to str = convert' "CP950" to (packWith convert835to950 str)
+convert' "ibm-939" to str = convert' "CP932" to (packWith convert939to932 str)
+convert' "ibm-947" to str = convert' "CP950" to str
+convert' "ibm-950" to str = convert' "CP950" to str
+convert' "ibm-937" to str = convert' "CP950" to $ S.map ((OpenAFP.!) ebc2ascIsPrintW8) str
+convert' "ibm-500" to str = convert' "ascii" to $ S.map ((OpenAFP.!) ebc2ascIsPrintW8) str
+convert' "ibm-37" to str = convert' "ascii" to $ S.map ((OpenAFP.!) ebc2ascIsPrintW8) str
 convert' from to str = case unsafePerformIO doConvert of
     Left ioerr -> Nothing
     Right str -> Just $! str
@@ -187,6 +199,19 @@
         txt     <- decodeLocale' encFrom noNewlineTranslation str
         encodeLocale' encTo noNewlineTranslation txt
 
+{-# INLINE packWith #-}
+packWith :: (Int -> Int) -> ByteString -> ByteString
+packWith f buf = unsafePerformIO $ S.unsafeUseAsCStringLen buf $ \(src, len) -> S.create len $ \target -> do
+    let s = castPtr src
+    let t = castPtr target
+    forM_ [0..(len `div` 2)-1] $ \i -> do
+        hi  <- peekByteOff s (i*2)       :: IO Word8
+        lo  <- peekByteOff s (i*2+1)     :: IO Word8
+        let ch         = f (fromEnum hi * 256 + fromEnum lo)
+            (hi', lo') = ch `divMod` 256
+        pokeByteOff t (i*2)   (toEnum hi' :: Word8)
+        pokeByteOff t (i*2+1) (toEnum lo' :: Word8)
+
 fieldsHtml :: [ViewField] -> [Html]
 fieldsHtml fs = [table << fsHtml] ++ membersHtml
     where
@@ -222,9 +247,14 @@
 contentHtml :: ViewContent -> Html
 contentHtml x = case x of
     ViewNumber _ n -> stringToHtml $ show n
-    ViewString _ s -> stringToHtml $ ['"'] ++ C.unpack s ++ ['"']
+    ViewString _ s -> stringToHtml $ ['"'] ++ unpackUTF8 s ++ ['"']
     ViewNStr  _ cs -> thespan << nstrHtml (map N1 (S.unpack cs))
     _              -> error (show x)
+
+unpackUTF8 :: ByteString -> String
+unpackUTF8 buf = unsafePerformIO $ do
+    enc <- mkTextEncoding "UTF-8"
+    fmap T.unpack $ decodeLocale' enc noNewlineTranslation buf
 
 nstrHtml :: [N1] -> String
 nstrHtml nstr
