├── .github └── workflows │ ├── packcheck.yml │ └── s390x.yml ├── .gitignore ├── .packcheck.ignore ├── Changelog.md ├── Data ├── ByteString │ └── UTF8 │ │ └── Normalize.hs ├── Text │ └── Normalize.hs └── Unicode │ ├── Internal │ └── NormalizeStream.hs │ └── Types.hs ├── LICENSE ├── MAINTAINING.md ├── NOTES.md ├── README.md ├── Setup.hs ├── appveyor.yml ├── benchmark ├── Benchmark.hs ├── Chart.hs ├── NormalizeFile.hs ├── README.md └── data │ ├── AllChars.txt │ ├── Deutsch.txt │ ├── Devanagari.txt │ ├── English.txt │ ├── Japanese.txt │ ├── Korean.txt │ └── Vietnamese.txt ├── cabal.project.coveralls ├── download-ucd-files.sh ├── stack.yaml ├── test ├── Extra.hs ├── NormalizationTest.hs ├── Properties.hs ├── QuickCheckUtils.hs └── data │ ├── NormalizationTest.txt │ └── extra │ └── NormalizationTest.txt └── unicode-transforms.cabal /.github/workflows/packcheck.yml: -------------------------------------------------------------------------------- 1 | # packcheck-0.5.1 2 | # You can use any of the options supported by packcheck as environment 3 | # variables here. See https://github.com/composewell/packcheck for all 4 | # options and their explanation. 5 | 6 | name: packcheck 7 | 8 | #----------------------------------------------------------------------------- 9 | # Events on which the build should be triggered 10 | #----------------------------------------------------------------------------- 11 | 12 | on: 13 | push: 14 | branches: 15 | - master 16 | pull_request: 17 | 18 | 19 | #----------------------------------------------------------------------------- 20 | # Build matrix 21 | #----------------------------------------------------------------------------- 22 | 23 | jobs: 24 | build: 25 | name: ${{ matrix.name }} 26 | env: 27 | # ------------------------------------------------------------------------ 28 | # Common options 29 | # ------------------------------------------------------------------------ 30 | # GHC_OPTIONS: "-Werror" 31 | CABAL_REINIT_CONFIG: y 32 | LC_ALL: C.UTF-8 33 | 34 | # ------------------------------------------------------------------------ 35 | # What to build 36 | # ------------------------------------------------------------------------ 37 | # DISABLE_TEST: "y" 38 | # DISABLE_BENCH: "y" 39 | # DISABLE_DOCS: "y" 40 | DISABLE_SDIST_BUILD: "y" 41 | # DISABLE_SDIST_GIT_CHECK: "y" 42 | # DISABLE_DIST_CHECKS: "y" 43 | 44 | # ------------------------------------------------------------------------ 45 | # stack options 46 | # ------------------------------------------------------------------------ 47 | # Note requiring a specific version of stack using STACKVER may fail due to 48 | # github API limit while checking and upgrading/downgrading to the specific 49 | # version. 50 | #STACKVER: "1.6.5" 51 | #STACK_UPGRADE: "y" 52 | #RESOLVER: "lts-12" 53 | 54 | # ------------------------------------------------------------------------ 55 | # cabal options 56 | # ------------------------------------------------------------------------ 57 | CABAL_CHECK_RELAX: y 58 | CABAL_HACKAGE_MIRROR: "hackage.haskell.org:http://hackage.fpcomplete.com" 59 | 60 | # ------------------------------------------------------------------------ 61 | # Where to find the required tools 62 | # ------------------------------------------------------------------------ 63 | PATH: /opt/ghc/bin:/sbin:/usr/sbin:/bin:/usr/bin 64 | #TOOLS_DIR: /opt 65 | 66 | # ------------------------------------------------------------------------ 67 | # Location of packcheck.sh (the shell script invoked to perform CI tests ). 68 | # ------------------------------------------------------------------------ 69 | # You can either commit the packcheck.sh script at this path in your repo or 70 | # you can use it by specifying the PACKCHECK_REPO_URL option below in which 71 | # case it will be automatically copied from the packcheck repo to this path 72 | # during CI tests. In any case it is finally invoked from this path. 73 | PACKCHECK: "./packcheck.sh" 74 | # If you have not committed packcheck.sh in your repo at PACKCHECK 75 | # then it is automatically pulled from this URL. 76 | PACKCHECK_GITHUB_URL: "https://raw.githubusercontent.com/composewell/packcheck" 77 | PACKCHECK_GITHUB_COMMIT: "v0.6.0" 78 | 79 | # ------------------------------------------------------------------------ 80 | # Final build variables 81 | # ------------------------------------------------------------------------ 82 | PACKCHECK_COMMAND: ${{ matrix.command }} ${{ matrix.pack_options }} 83 | 84 | runs-on: ${{ matrix.runner }} 85 | strategy: 86 | fail-fast: false 87 | matrix: 88 | name: 89 | - 9.12.1 90 | - 9.10.1 91 | - 9.8.1 92 | - 9.6.3 93 | - 9.4.7 94 | - 9.2.8 95 | - 9.0.2 96 | - 8.10.7 97 | - 8.10.7+stack 98 | - 8.8.4 99 | - 8.6.5 100 | - 8.4.4 101 | - 8.2.2 102 | - 8.0.2 103 | include: 104 | - name: 9.12.1 105 | ghc-version: 9.12.1 106 | command: cabal-v2 107 | runner: ubuntu-latest 108 | cabal-version: 3.14.1.1 109 | 110 | - name: 9.10.1 111 | ghc-version: 9.10.1 112 | command: cabal-v2 113 | runner: ubuntu-latest 114 | cabal-version: 3.10.1.0 115 | 116 | - name: 9.8.1 117 | ghc-version: 9.8.1 118 | command: cabal-v2 119 | runner: ubuntu-latest 120 | cabal-version: 3.10.1.0 121 | 122 | - name: 9.6.3 123 | ghc-version: 9.6.3 124 | command: cabal-v2 125 | runner: ubuntu-latest 126 | cabal-version: 3.10.1.0 127 | 128 | - name: 9.4.7 129 | ghc-version: 9.4.7 130 | command: cabal-v2 131 | runner: ubuntu-latest 132 | cabal-version: 3.8.1.0 133 | 134 | - name: 9.2.8 135 | ghc-version: 9.2.8 136 | command: cabal-v2 137 | runner: ubuntu-latest 138 | cabal-version: 3.6 139 | 140 | - name: 9.0.2 141 | ghc-version: 9.0.2 142 | command: cabal-v2 143 | runner: ubuntu-latest 144 | cabal-version: 3.2 145 | 146 | - name: 8.10.7 147 | ghc-version: 8.10.7 148 | command: cabal-v2 149 | runner: ubuntu-latest 150 | cabal-version: 3.2 151 | 152 | - name: 8.8.4 153 | ghc-version: 8.8.4 154 | command: cabal-v2 155 | runner: ubuntu-latest 156 | cabal-version: 3.2 157 | 158 | - name: 8.6.5 159 | ghc-version: 8.6.5 160 | command: cabal-v2 161 | runner: ubuntu-latest 162 | cabal-version: 3.2 163 | pack_options: >- 164 | DISABLE_BENCH=y 165 | 166 | - name: 8.4.4 167 | ghc-version: 8.4.4 168 | command: cabal-v2 169 | runner: ubuntu-latest 170 | cabal-version: 3.2 171 | pack_options: >- 172 | DISABLE_BENCH=y 173 | 174 | - name: 8.2.2 175 | ghc-version: 8.2.2 176 | command: cabal-v2 177 | runner: ubuntu-latest 178 | cabal-version: 3.2 179 | 180 | - name: 8.0.2 181 | ghc-version: 8.0.2 182 | command: cabal-v2 183 | runner: ubuntu-latest 184 | cabal-version: 3.2 185 | 186 | - name: 8.10.7+stack 187 | ghc-version: 8.10.7 188 | command: stack 189 | runner: ubuntu-latest 190 | cabal-version: 3.2 191 | pack_options: >- 192 | RESOLVER=lts-18.18 193 | 194 | # - name: hlint 195 | # command: cabal-v2 196 | # runner: ubuntu-latest 197 | # pack_options: >- 198 | # HLINT_OPTIONS="lint" 199 | # HLINT_TARGETS="Data" 200 | 201 | steps: 202 | - uses: actions/checkout@v4 203 | 204 | - uses: haskell-actions/setup@v2 205 | with: 206 | ghc-version: ${{ matrix.ghc-version }} 207 | cabal-version: ${{ matrix.cabal-version }} 208 | 209 | 210 | - uses: actions/cache@v4 211 | name: Cache common directories 212 | with: 213 | path: | 214 | ~/.cabal 215 | ~/.ghc 216 | ~/.local 217 | ~/.stack 218 | key: ${{ matrix.ghc_version }}-${{ matrix.runner }} 219 | 220 | - name: Run installer 221 | if: ${{ matrix.installer != '' }} 222 | run: ${{ matrix.installer }} 223 | 224 | - name: Setup stack 225 | if: ${{ matrix.command == 'stack' }} 226 | run: | 227 | # required for packcheck 228 | sudo apt-get install -y curl 229 | # required for outbound https for stack and for stack setup 230 | sudo apt-get install -y netbase xz-utils make 231 | 232 | - name: Download packcheck 233 | run: | 234 | # Get packcheck if needed 235 | CURL=$(which curl) 236 | PACKCHECK_URL=${PACKCHECK_GITHUB_URL}/${PACKCHECK_GITHUB_COMMIT}/packcheck.sh 237 | if test ! -e "$PACKCHECK"; then $CURL -sL -o "$PACKCHECK" $PACKCHECK_URL; fi; 238 | chmod +x $PACKCHECK 239 | 240 | - name: Run packcheck 241 | run: | 242 | bash -c "$PACKCHECK $PACKCHECK_COMMAND" 243 | -------------------------------------------------------------------------------- /.github/workflows/s390x.yml: -------------------------------------------------------------------------------- 1 | name: s390x 2 | on: 3 | push: 4 | branches: 5 | - master 6 | pull_request: {} # Validate all PRs 7 | 8 | defaults: 9 | run: 10 | shell: bash 11 | 12 | jobs: 13 | # Emulation on s390x platform is incredibly slow and memory demanding. 14 | # It seems that any executable with GHC RTS takes at least 7-8 Gb of RAM, so we can 15 | # run `cabal` or `ghc` on their own, but cannot run them both at the same time, striking 16 | # out `cabal test`. Instead we rely on system packages and invoke `ghc --make` manually, 17 | # and even so `ghc -O` is prohibitively expensive. 18 | build: 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@v4 22 | - uses: uraimo/run-on-arch-action@v2.1.1 23 | timeout-minutes: 60 24 | with: 25 | arch: s390x 26 | distro: ubuntu20.04 27 | githubToken: ${{ github.token }} 28 | install: | 29 | apt-get update -y 30 | apt-get install -y ghc libghc-quickcheck2-dev libghc-hspec-dev libghc-getopt-generics-dev libghc-split-dev curl 31 | run: | 32 | ghc --version 33 | curl -s -L https://hackage.haskell.org/package/unicode-data-0.3.0.tar.gz | tar xz 34 | ghc --make -XMagicHash -XBangPatterns -XUnboxedTuples -itest:unicode-data-0.3.0/lib -o extras test/Extra.hs 35 | ./extras 36 | ghc --make -XMagicHash -XBangPatterns -XUnboxedTuples -itest:unicode-data-0.3.0/lib -o quickcheck test/Properties.hs 37 | ./quickcheck 38 | ghc --make -XMagicHash -XBangPatterns -XUnboxedTuples -itest:unicode-data-0.3.0/lib -o ucd test/NormalizationTest.hs 39 | ./ucd 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | dist-* 3 | cabal-dev 4 | *.o 5 | *.hi 6 | *.chi 7 | *.chs.h 8 | *.dyn_o 9 | *.dyn_hi 10 | .hpc 11 | .hsenv 12 | .cabal-sandbox/ 13 | cabal.sandbox.config 14 | *.prof 15 | *.aux 16 | *.hp 17 | *.eventlog 18 | .stack-work/ 19 | cabal.project.local 20 | cabal.project.local~ 21 | .HTF/ 22 | .ghc.environment.* 23 | 24 | unicode-data/ucdxml/ucd.all.flat.pdb 25 | unicode-data/ucdxml/ucd.all.flat.xml 26 | -------------------------------------------------------------------------------- /.packcheck.ignore: -------------------------------------------------------------------------------- 1 | .packcheck.ignore 2 | cabal.project.coveralls 3 | cabal.project 4 | .gitignore 5 | .github/workflows/packcheck.yml 6 | appveyor.yml 7 | stack.yaml 8 | -------------------------------------------------------------------------------- /Changelog.md: -------------------------------------------------------------------------------- 1 | ## (Unreleased) 2 | 3 | * Support GHC 9.4 and 9.6: allow `base 4.18` and `ghc-prim 0.10` 4 | * Support `unicode-data 0.4` 5 | 6 | ## 0.4.0.1 (March 2022) 7 | 8 | * Support `text-icu == 0.8.*` in tests 9 | * Support `unicode-data == 0.3.*` 10 | 11 | ## 0.4.0 (November 2021) 12 | 13 | * Bump `unicode-data` to `0.2` 14 | * Allow `text 2.0` 15 | * Update to Unicode version 14.0.0 16 | * Drop support for GHC 7.10 17 | 18 | ## 0.3.8 19 | 20 | * Allow `ghc-prim 0.7` 21 | * Extract `unicode-data` into its own package 22 | * Depend on the latest stable `text` 23 | 24 | ## 0.3.7.1 25 | 26 | * Fix x32 build 27 | 28 | ## 0.3.7 29 | 30 | * Significant performance improvements 31 | * Update to Unicode version 13.0.0 32 | 33 | ## 0.3.6 34 | 35 | * Update to Unicode version 12.1.0 36 | * Update Quickcheck dependency version bounds 37 | * Test with GHC 8.6.5 38 | 39 | ## 0.3.5 40 | 41 | * Update dependency version bounds 42 | * Test with GHC 8.6.2 43 | 44 | ## 0.3.4 45 | 46 | * GHC 8.4.1 support 47 | 48 | ## 0.3.3 49 | 50 | * GHC 8.2.1 support 51 | 52 | ## 0.3.2 53 | 54 | * Work around a GHC/LLVM issue for ARM 55 | 56 | ## 0.3.1 57 | 58 | * Update dependency versions 59 | 60 | ## 0.3.0 61 | 62 | * Support Unicode version 9.0 63 | 64 | ## 0.2.1 65 | 66 | * Improve speed and resource hog during compilation 67 | 68 | ## 0.2.0 69 | 70 | * Support Unicode version 8.0 71 | * Switch to pure Haskell implementation 72 | 73 | ## 0.1.0.1 74 | 75 | * Initial release based on utf8proc C implementation 76 | -------------------------------------------------------------------------------- /Data/ByteString/UTF8/Normalize.hs: -------------------------------------------------------------------------------- 1 | -- | 2 | -- Module : Data.ByteString.UTF8.Normalize 3 | -- Copyright : (c) 2016 Harendra Kumar 4 | -- 5 | -- License : BSD-3-Clause 6 | -- Maintainer : harendra.kumar@gmail.com 7 | -- Stability : experimental 8 | -- Portability : GHC 9 | -- 10 | -- Unicode normalization for @ByteString@ data type. 11 | -- 12 | module Data.ByteString.UTF8.Normalize 13 | {-# DEPRECATED "Convert ByteString to Text and then normalize" #-} 14 | ( 15 | -- * Normalization Modes 16 | NormalizationMode(..) 17 | -- * Normalization API 18 | , normalize 19 | ) where 20 | 21 | import Data.ByteString (ByteString) 22 | import Data.Text.Encoding (decodeUtf8, encodeUtf8) 23 | import Data.Unicode.Types (NormalizationMode(..)) 24 | import qualified Data.Text.Normalize as T 25 | 26 | -- This is now simply a wrapper over Text normalization 27 | 28 | -- | Perform Unicode normalization on a UTF8 encoded @ByteString@ according to 29 | -- the specified normalization mode. 30 | normalize :: NormalizationMode -> ByteString -> ByteString 31 | normalize mode = (encodeUtf8 . T.normalize mode . decodeUtf8) 32 | -------------------------------------------------------------------------------- /Data/Text/Normalize.hs: -------------------------------------------------------------------------------- 1 | -- {-# OPTIONS_GHC -funfolding-fun-discount=90 #-} 2 | -- | 3 | -- Module : Data.Text.Normalize 4 | -- Copyright : (c) 2016 Harendra Kumar 5 | -- 6 | -- License : BSD-3-Clause 7 | -- Maintainer : harendra.kumar@gmail.com 8 | -- Stability : experimental 9 | -- Portability : GHC 10 | -- 11 | -- Unicode normalization for @Text@ data type. 12 | -- 13 | module Data.Text.Normalize 14 | ( 15 | -- * Normalization Modes 16 | NormalizationMode(..) 17 | -- * Normalization API 18 | , normalize 19 | ) where 20 | 21 | import Data.Text (Text) 22 | import Data.Unicode.Types (NormalizationMode(..)) 23 | 24 | -- Internal modules 25 | import Data.Unicode.Internal.NormalizeStream 26 | ( DecomposeMode(..) 27 | , stream 28 | , unstream 29 | , unstreamC 30 | ) 31 | 32 | -- | Perform Unicode normalization on @Text@ according to the specified 33 | -- normalization mode. 34 | normalize :: NormalizationMode -> Text -> Text 35 | normalize mode = 36 | case mode of 37 | NFD -> (unstream Canonical) . stream 38 | NFKD -> (unstream Kompat) . stream 39 | NFC -> (unstreamC Canonical) . stream 40 | NFKC -> (unstreamC Kompat) . stream 41 | -------------------------------------------------------------------------------- /Data/Unicode/Internal/NormalizeStream.hs: -------------------------------------------------------------------------------- 1 | {-# OPTIONS_GHC -funbox-strict-fields #-} 2 | {-# LANGUAGE BangPatterns #-} 3 | {-# LANGUAGE CPP #-} 4 | {-# LANGUAGE LambdaCase #-} 5 | {-# LANGUAGE TupleSections #-} 6 | -- | 7 | -- Module : Data.Unicode.Internal.NormalizeStream 8 | -- Copyright : (c) 2016 Harendra Kumar 9 | -- (c) 2020 Andrew Lelechenko 10 | -- 11 | -- License : BSD-3-Clause 12 | -- Maintainer : harendra.kumar@gmail.com 13 | -- Stability : experimental 14 | -- 15 | -- Stream based normalization. 16 | -- 17 | module Data.Unicode.Internal.NormalizeStream 18 | ( 19 | UC.DecomposeMode(..) 20 | , stream 21 | , unstream 22 | , unstreamC 23 | ) 24 | where 25 | 26 | import Data.Char (chr, ord) 27 | import GHC.ST (ST(..)) 28 | import GHC.Types (SPEC(..)) 29 | 30 | import qualified Data.Text.Array as A 31 | import qualified Unicode.Char as UC 32 | 33 | #if MIN_VERSION_text(2,0,0) 34 | import Data.Text.Internal.Fusion (stream) 35 | #else 36 | import Data.Bits (shiftR) 37 | import Data.Text.Internal.Unsafe.Char (unsafeChr) 38 | import Data.Text.Internal.Fusion.Size (betweenSize) 39 | import Data.Text.Internal.Encoding.Utf16 (chr2) 40 | #endif 41 | 42 | -- Internal modules 43 | import Data.Text.Internal (Text(..)) 44 | import Data.Text.Internal.Fusion.Size (upperBound) 45 | import Data.Text.Internal.Fusion.Types (Step(..), Stream(..)) 46 | import Data.Text.Internal.Private (runText) 47 | import Data.Text.Internal.Unsafe.Char (unsafeWrite) 48 | 49 | ------------------------------------------------------------------------------- 50 | -- Reorder buffer to hold characters till the next starter boundary 51 | ------------------------------------------------------------------------------- 52 | 53 | -- | A list of combining characters, ordered by 'UC.combiningClass'. 54 | -- Couple of top levels are unrolled and unpacked for efficiency. 55 | data ReBuf = Empty | One !Char | Many !Char !Char ![Char] 56 | 57 | {-# INLINE insertIntoReBuf #-} 58 | insertIntoReBuf :: Char -> ReBuf -> ReBuf 59 | insertIntoReBuf c Empty = One c 60 | insertIntoReBuf c (One c0) 61 | | UC.combiningClass c < UC.combiningClass c0 62 | = Many c c0 [] 63 | | otherwise 64 | = Many c0 c [] 65 | insertIntoReBuf c (Many c0 c1 cs) 66 | | cc < UC.combiningClass c0 67 | = Many c c0 (c1 : cs) 68 | | cc < UC.combiningClass c1 69 | = Many c0 c (c1 : cs) 70 | | otherwise 71 | = Many c0 c1 (cs' ++ (c : cs'')) 72 | where 73 | cc = UC.combiningClass c 74 | (cs', cs'') = span ((<= cc) . UC.combiningClass) cs 75 | 76 | writeStr :: A.MArray s -> Int -> [Char] -> ST s Int 77 | writeStr marr di str = go di str 78 | where 79 | go i [] = return i 80 | go i (c : cs) = do 81 | n <- unsafeWrite marr i c 82 | go (i + n) cs 83 | 84 | {-# INLINE writeReorderBuffer #-} 85 | writeReorderBuffer :: A.MArray s -> Int -> ReBuf -> ST s Int 86 | writeReorderBuffer _ di Empty = return di 87 | 88 | writeReorderBuffer marr di (One c) = do 89 | n <- unsafeWrite marr di c 90 | return (di + n) 91 | 92 | writeReorderBuffer marr di (Many c1 c2 str) = do 93 | n1 <- unsafeWrite marr di c1 94 | n2 <- unsafeWrite marr (di + n1) c2 95 | writeStr marr (di + n1 + n2) str 96 | 97 | ------------------------------------------------------------------------------- 98 | -- Decomposition of Hangul characters is done algorithmically 99 | ------------------------------------------------------------------------------- 100 | 101 | -- {-# INLINE decomposeCharHangul #-} 102 | decomposeCharHangul :: A.MArray s -> Int -> Char -> ST s Int 103 | decomposeCharHangul marr j c = 104 | if t == chr UC.jamoTFirst then do 105 | n1 <- unsafeWrite marr j l 106 | n2 <- unsafeWrite marr (j + n1) v 107 | return (j + n1 + n2) 108 | else do 109 | n1 <- unsafeWrite marr j l 110 | n2 <- unsafeWrite marr (j + n1) v 111 | n3 <- unsafeWrite marr (j + n1 + n2) t 112 | return (j + n1 + n2 + n3) 113 | where 114 | (l, v, t) = UC.decomposeHangul c 115 | 116 | {-# INLINE decomposeChar #-} 117 | decomposeChar 118 | :: UC.DecomposeMode 119 | -> A.MArray s -- destination array for decomposition 120 | -> Int -- array index 121 | -> ReBuf -- reorder buffer 122 | -> Char -- char to be decomposed 123 | -> ST s (Int, ReBuf) 124 | decomposeChar mode marr index reBuf ch 125 | | UC.isHangul ch = do 126 | j <- writeReorderBuffer marr index reBuf 127 | (, Empty) <$> decomposeCharHangul marr j ch 128 | | UC.isDecomposable mode ch = 129 | decomposeAll marr index reBuf (UC.decompose mode ch) 130 | | otherwise = 131 | reorder marr index reBuf ch 132 | 133 | where 134 | 135 | {-# INLINE decomposeAll #-} 136 | decomposeAll _ i rbuf [] = return (i, rbuf) 137 | decomposeAll arr i rbuf (x : xs) 138 | | UC.isDecomposable mode x = do 139 | (i', rbuf') <- decomposeAll arr i rbuf (UC.decompose mode x) 140 | decomposeAll arr i' rbuf' xs 141 | | otherwise = do 142 | (i', rbuf') <- reorder arr i rbuf x 143 | decomposeAll arr i' rbuf' xs 144 | 145 | {-# INLINE reorder #-} 146 | reorder arr i rbuf c 147 | | UC.isCombining c = return (i, insertIntoReBuf c rbuf) 148 | | otherwise = do 149 | j <- writeReorderBuffer arr i rbuf 150 | n <- unsafeWrite arr j c 151 | return (j + n, Empty) 152 | 153 | #if !MIN_VERSION_text(2,0,0) 154 | -- | /O(n)/ Convert a 'Text' into a 'Stream Char'. 155 | stream :: Text -> Stream Char 156 | stream (Text arr off len) = Stream next off (betweenSize (len `shiftR` 1) len) 157 | where 158 | !end = off+len 159 | {-# INLINE next #-} 160 | next !i 161 | | i >= end = Done 162 | -- shift generates only two branches instead of three in case of 163 | -- range check, works quite a bit faster with llvm backend. 164 | | (n `shiftR` 10) == 0x36 = Yield (chr2 n n2) (i + 2) 165 | | otherwise = Yield (unsafeChr n) (i + 1) 166 | where 167 | n = A.unsafeIndex arr i 168 | n2 = A.unsafeIndex arr (i + 1) 169 | {-# INLINE [0] stream #-} 170 | #endif 171 | 172 | -- | /O(n)/ Convert a 'Stream Char' into a decompose-normalized 'Text'. 173 | unstream :: UC.DecomposeMode -> Stream Char -> Text 174 | unstream mode (Stream next0 s0 len) = runText $ \done -> do 175 | -- Before encoding each char we perform a buffer realloc check assuming 176 | -- worst case encoding size of two 16-bit units for the char. Just add an 177 | -- extra space to the buffer so that we do not end up reallocating even when 178 | -- all the chars are encoded as single unit. 179 | let margin = 1 + maxDecomposeLen 180 | mlen = (upperBound 4 len + margin) 181 | arr0 <- A.new mlen 182 | let outer !arr !maxi = encode 183 | where 184 | -- keep the common case loop as small as possible 185 | encode !si !di rbuf = 186 | -- simply check for the worst case 187 | if maxi < di + margin 188 | then realloc si di rbuf 189 | else 190 | case next0 si of 191 | Done -> do 192 | di' <- writeReorderBuffer arr di rbuf 193 | done arr di' 194 | Skip si' -> encode si' di rbuf 195 | Yield c si' -> do 196 | (di', rbuf') <- decomposeChar mode arr di rbuf c 197 | encode si' di' rbuf' 198 | -- n <- unsafeWrite arr di c 199 | -- encode si' (di + n) rbuf 200 | 201 | -- keep uncommon case separate from the common case code 202 | {-# NOINLINE realloc #-} 203 | realloc !si !di rbuf = do 204 | let newlen = maxi * 2 205 | arr' <- A.new newlen 206 | A.copyM arr' 0 arr 0 di 207 | outer arr' (newlen - 1) si di rbuf 208 | 209 | outer arr0 (mlen - 1) s0 0 Empty 210 | {-# INLINE [0] unstream #-} 211 | 212 | -- we can generate this from UCD 213 | maxDecomposeLen :: Int 214 | maxDecomposeLen = 32 215 | 216 | ------------------------------------------------------------------------------- 217 | -- Composition 218 | ------------------------------------------------------------------------------- 219 | 220 | -- If we are composing we do not need to first decompose Hangul. We can just 221 | -- compose assuming there could be some partially composed syllables e.g. LV 222 | -- syllable followed by a jamo T. We need to compose this case as well. 223 | 224 | -- Hold an L to wait for V, hold an LV to wait for T. 225 | data JamoBuf 226 | = Jamo !Char -- Jamo L, V or T 227 | | Hangul !Char -- Hangul Syllable LV or LVT 228 | | HangulLV !Char 229 | 230 | data RegBuf 231 | = RegOne !Char 232 | | RegMany !Char !Char ![Char] 233 | 234 | data ComposeState 235 | = ComposeNone 236 | | ComposeReg !RegBuf 237 | | ComposeJamo !JamoBuf 238 | 239 | ------------------------------------------------------------------------------- 240 | -- Composition of Jamo into Hangul syllables, done algorithmically 241 | ------------------------------------------------------------------------------- 242 | 243 | {-# INLINE writeJamoBuf #-} 244 | writeJamoBuf :: A.MArray s -> Int -> JamoBuf -> ST s Int 245 | writeJamoBuf arr i jbuf = do 246 | n <- unsafeWrite arr i (getCh jbuf) 247 | return (i + n) 248 | 249 | where 250 | 251 | getCh (Jamo ch) = ch 252 | getCh (Hangul ch) = ch 253 | getCh (HangulLV ch) = ch 254 | 255 | {-# INLINE initHangul #-} 256 | initHangul :: Char -> Int -> ST s (Int, ComposeState) 257 | initHangul c i = return (i, ComposeJamo (Hangul c)) 258 | 259 | {-# INLINE initJamo #-} 260 | initJamo :: Char -> Int -> ST s (Int, ComposeState) 261 | initJamo c i = return (i, ComposeJamo (Jamo c)) 262 | 263 | {-# INLINE insertJamo #-} 264 | insertJamo 265 | :: A.MArray s -> Int -> JamoBuf -> Char -> ST s (Int, ComposeState) 266 | insertJamo arr i jbuf ch 267 | | ich <= UC.jamoLLast = do 268 | j <- writeJamoBuf arr i jbuf 269 | return (j, ComposeJamo (Jamo ch)) 270 | | ich < UC.jamoVFirst = 271 | flushAndWrite arr i jbuf ch 272 | | ich <= UC.jamoVLast = do 273 | case jbuf of 274 | Jamo c -> 275 | case UC.jamoLIndex c of 276 | Just li -> 277 | let vi = ich - UC.jamoVFirst 278 | lvi = li * UC.jamoNCount + vi * UC.jamoTCount 279 | lv = chr (UC.hangulFirst + lvi) 280 | in return (i, ComposeJamo (HangulLV lv)) 281 | Nothing -> writeTwo arr i c ch 282 | Hangul c -> writeTwo arr i c ch 283 | HangulLV c -> writeTwo arr i c ch 284 | | ich <= UC.jamoTFirst = do 285 | flushAndWrite arr i jbuf ch 286 | | otherwise = do 287 | let ti = ich - UC.jamoTFirst 288 | case jbuf of 289 | Jamo c -> writeTwo arr i c ch 290 | Hangul c 291 | | UC.isHangulLV c -> do 292 | writeLVT arr i c ti 293 | | otherwise -> 294 | writeTwo arr i c ch 295 | HangulLV c -> 296 | writeLVT arr i c ti 297 | 298 | where 299 | 300 | ich = ord ch 301 | 302 | {-# INLINE flushAndWrite #-} 303 | flushAndWrite marr ix jb c = do 304 | j <- writeJamoBuf marr ix jb 305 | n <- unsafeWrite marr j c 306 | return (j + n, ComposeNone) 307 | 308 | {-# INLINE writeLVT #-} 309 | writeLVT marr ix lv ti = do 310 | n <- unsafeWrite marr ix (chr ((ord lv) + ti)) 311 | return (ix + n, ComposeNone) 312 | 313 | {-# INLINE writeTwo #-} 314 | writeTwo marr ix c1 c2 = do 315 | n <- unsafeWrite marr ix c1 316 | m <- unsafeWrite marr (ix + n) c2 317 | return ((ix + n + m), ComposeNone) 318 | 319 | {-# INLINE insertHangul #-} 320 | insertHangul 321 | :: A.MArray s -> Int -> JamoBuf -> Char -> ST s (Int, ComposeState) 322 | insertHangul arr i jbuf ch = do 323 | j <- writeJamoBuf arr i jbuf 324 | return (j, ComposeJamo (Hangul ch)) 325 | 326 | {-# INLINE insertIntoRegBuf #-} 327 | insertIntoRegBuf :: Char -> RegBuf -> RegBuf 328 | insertIntoRegBuf c (RegOne c0) 329 | | UC.combiningClass c < UC.combiningClass c0 330 | = RegMany c c0 [] 331 | | otherwise 332 | = RegMany c0 c [] 333 | insertIntoRegBuf c (RegMany c0 c1 cs) 334 | | cc < UC.combiningClass c0 335 | = RegMany c c0 (c1 : cs) 336 | | cc < UC.combiningClass c1 337 | = RegMany c0 c (c1 : cs) 338 | | otherwise 339 | = RegMany c0 c1 (cs' ++ (c : cs'')) 340 | where 341 | cc = UC.combiningClass c 342 | (cs', cs'') = span ((<= cc) . UC.combiningClass) cs 343 | 344 | {-# INLINE writeRegBuf #-} 345 | writeRegBuf :: A.MArray s -> Int -> RegBuf -> ST s Int 346 | writeRegBuf arr i = \case 347 | RegOne c -> do 348 | n <- unsafeWrite arr i c 349 | return (i + n) 350 | RegMany st c [] -> 351 | case UC.compose st c of 352 | Just x -> do 353 | n <- unsafeWrite arr i x 354 | return (i + n) 355 | Nothing -> do 356 | n <- unsafeWrite arr i st 357 | m <- unsafeWrite arr (i + n) c 358 | return (i + n + m) 359 | RegMany st0 c0 cs0 -> go [] st0 (c0 : cs0) 360 | 361 | where 362 | 363 | -- arguments: uncombined chars, starter, unprocessed str 364 | go uncs st [] = writeStr arr i (st : uncs) 365 | go uncs st (c : cs) = case UC.compose st c of 366 | Nothing -> go (uncs ++ (c : same)) st bigger 367 | Just x -> go uncs x cs 368 | where 369 | cc = UC.combiningClass c 370 | (same, bigger) = span ((== cc) . UC.combiningClass) cs 371 | 372 | {-# INLINE flushComposeState #-} 373 | flushComposeState :: A.MArray s -> Int -> ComposeState -> ST s Int 374 | flushComposeState arr i = \case 375 | ComposeNone -> pure i 376 | ComposeReg rbuf -> writeRegBuf arr i rbuf 377 | ComposeJamo jbuf -> writeJamoBuf arr i jbuf 378 | 379 | {-# INLINE composeChar #-} 380 | composeChar 381 | :: UC.DecomposeMode 382 | -> A.MArray s -- destination array for composition 383 | -> Char -- input char 384 | -> Int -- array index 385 | -> ComposeState 386 | -> ST s (Int, ComposeState) 387 | composeChar mode marr = go0 388 | 389 | where 390 | 391 | go0 ch !i !st = 392 | case st of 393 | ComposeReg rbuf 394 | | ich < UC.jamoLFirst -> 395 | composeReg rbuf ch i st 396 | | ich <= UC.jamoTLast -> do 397 | j <- writeRegBuf marr i rbuf 398 | initJamo ch j 399 | | ich < UC.hangulFirst -> 400 | composeReg rbuf ch i st 401 | | ich <= UC.hangulLast -> do 402 | j <- writeRegBuf marr i rbuf 403 | initHangul ch j 404 | | otherwise -> 405 | composeReg rbuf ch i st 406 | ComposeJamo jbuf 407 | | ich < UC.jamoLFirst -> do 408 | jamoToReg marr i jbuf ch 409 | | ich <= UC.jamoTLast -> do 410 | insertJamo marr i jbuf ch 411 | | ich < UC.hangulFirst -> 412 | jamoToReg marr i jbuf ch 413 | | ich <= UC.hangulLast -> do 414 | insertHangul marr i jbuf ch 415 | | otherwise -> 416 | jamoToReg marr i jbuf ch 417 | ComposeNone 418 | | ich < UC.jamoLFirst -> 419 | initReg ch i 420 | | ich <= UC.jamoTLast -> 421 | initJamo ch i 422 | | ich < UC.hangulFirst -> 423 | initReg ch i 424 | | ich <= UC.hangulLast -> 425 | initHangul ch i 426 | | otherwise -> 427 | initReg ch i 428 | where ich = ord ch 429 | 430 | {-# INLINE jamoToReg #-} 431 | jamoToReg arr i jbuf ch = do 432 | j <- writeJamoBuf arr i jbuf 433 | initReg ch j 434 | 435 | {-# INLINE initReg #-} 436 | initReg !ch !i 437 | | UC.isDecomposable mode ch = 438 | go (UC.decompose mode ch) i ComposeNone 439 | | otherwise = 440 | pure (i, ComposeReg (RegOne ch)) 441 | 442 | {-# INLINE composeReg #-} 443 | composeReg rbuf !ch !i !st 444 | | UC.isDecomposable mode ch = 445 | go (UC.decompose mode ch) i st 446 | | UC.isCombining ch = do 447 | pure (i, ComposeReg (insertIntoRegBuf ch rbuf)) 448 | -- The first char in RegBuf may or may not be a starter. In 449 | -- case it is not we rely on composeStarters failing. 450 | | RegOne s <- rbuf 451 | , UC.isCombiningStarter ch 452 | , Just x <- UC.composeStarters s ch = 453 | pure (i, (ComposeReg (RegOne x))) 454 | | otherwise = do 455 | j <- writeRegBuf marr i rbuf 456 | pure (j, ComposeReg (RegOne ch)) 457 | 458 | go [] !i !st = pure (i, st) 459 | go (ch : rest) i st = 460 | case st of 461 | ComposeReg rbuf 462 | | UC.isHangul ch -> do 463 | j <- writeRegBuf marr i rbuf 464 | (k, s) <- initHangul ch j 465 | go rest k s 466 | | UC.isJamo ch -> do 467 | j <- writeRegBuf marr i rbuf 468 | (k, s) <- initJamo ch j 469 | go rest k s 470 | | UC.isDecomposable mode ch -> 471 | go (UC.decompose mode ch ++ rest) i st 472 | | UC.isCombining ch -> do 473 | go rest i (ComposeReg (insertIntoRegBuf ch rbuf)) 474 | | RegOne s <- rbuf 475 | , UC.isCombiningStarter ch 476 | , Just x <- UC.composeStarters s ch -> 477 | go rest i (ComposeReg (RegOne x)) 478 | | otherwise -> do 479 | j <- writeRegBuf marr i rbuf 480 | go rest j (ComposeReg (RegOne ch)) 481 | ComposeJamo jbuf 482 | | UC.isJamo ch -> do 483 | (j, s) <- insertJamo marr i jbuf ch 484 | go rest j s 485 | | UC.isHangul ch -> do 486 | (j, s) <- insertHangul marr i jbuf ch 487 | go rest j s 488 | | otherwise -> do 489 | j <- writeJamoBuf marr i jbuf 490 | case () of 491 | _ 492 | | UC.isDecomposable mode ch -> 493 | go (UC.decompose mode ch ++ rest) j 494 | ComposeNone 495 | | otherwise -> 496 | go rest j (ComposeReg (RegOne ch)) 497 | ComposeNone 498 | | UC.isHangul ch -> do 499 | (j, s) <- initHangul ch i 500 | go rest j s 501 | | UC.isJamo ch -> do 502 | (j, s) <- initJamo ch i 503 | go rest j s 504 | | UC.isDecomposable mode ch -> 505 | go (UC.decompose mode ch ++ rest) i st 506 | | otherwise -> 507 | go rest i (ComposeReg (RegOne ch)) 508 | 509 | -- | /O(n)/ Convert a 'Stream Char' into a composed normalized 'Text'. 510 | unstreamC :: UC.DecomposeMode -> Stream Char -> Text 511 | unstreamC mode (Stream next0 s0 len) = runText $ \done -> do 512 | -- Before encoding each char we perform a buffer realloc check assuming 513 | -- worst case encoding size of two 16-bit units for the char. Just add an 514 | -- extra space to the buffer so that we do not end up reallocating even when 515 | -- all the chars are encoded as single unit. 516 | let margin = 1 + maxDecomposeLen 517 | mlen = (upperBound 4 len + margin) 518 | arr0 <- A.new mlen 519 | let outer !arr !maxi = encode SPEC 520 | where 521 | -- keep the common case loop as small as possible 522 | encode !_ !si !di st = 523 | -- simply check for the worst case 524 | if maxi < di + margin 525 | then realloc si di st 526 | else 527 | case next0 si of 528 | Done -> do 529 | di' <- flushComposeState arr di st 530 | done arr di' 531 | Skip si' -> encode SPEC si' di st 532 | Yield c si' -> do 533 | (di', st') <- composeChar mode arr c di st 534 | encode SPEC si' di' st' 535 | 536 | -- keep uncommon case separate from the common case code 537 | {-# NOINLINE realloc #-} 538 | realloc !si !di st = do 539 | let newlen = maxi * 2 540 | arr' <- A.new newlen 541 | A.copyM arr' 0 arr 0 di 542 | outer arr' (newlen - 1) si di st 543 | 544 | outer arr0 (mlen - 1) s0 0 ComposeNone 545 | {-# INLINE [0] unstreamC #-} 546 | -------------------------------------------------------------------------------- /Data/Unicode/Types.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP #-} 2 | #if __GLASGOW_HASKELL__ < 7100 3 | {-# LANGUAGE DeriveDataTypeable #-} 4 | #endif 5 | -- | 6 | -- Module : Data.Unicode.Types 7 | -- Copyright : (c) 2016 Harendra Kumar 8 | -- 9 | -- License : BSD-3-Clause 10 | -- Maintainer : harendra.kumar@gmail.com 11 | -- Stability : experimental 12 | -- Portability : GHC 13 | -- 14 | -- Character set normalization functions for Unicode. The documentation and 15 | -- API in this module is largely borrowed from @text-icu@. 16 | 17 | module Data.Unicode.Types 18 | ( 19 | NormalizationMode(..) 20 | ) where 21 | 22 | #if __GLASGOW_HASKELL__ < 912 23 | import Data.Typeable (Typeable) 24 | #endif 25 | 26 | -- | 27 | -- Normalization transforms Unicode text into an equivalent 28 | -- composed or decomposed form, allowing for easier sorting and 29 | -- searching of text. Standard normalization forms are described in 30 | -- , 31 | -- Unicode Standard Annex #15: Unicode Normalization Forms. 32 | -- 33 | -- Characters with accents or other adornments can be encoded in 34 | -- several different ways in Unicode. For example, take the character A-acute. 35 | -- In Unicode, this can be encoded as a single character (the 36 | -- \"composed\" form): 37 | -- 38 | -- @ 39 | -- 00C1 LATIN CAPITAL LETTER A WITH ACUTE 40 | -- @ 41 | -- 42 | -- or as two separate characters (the \"decomposed\" form): 43 | -- 44 | -- @ 45 | -- 0041 LATIN CAPITAL LETTER A 46 | -- 0301 COMBINING ACUTE ACCENT 47 | -- @ 48 | -- 49 | -- To a user of your program, however, both of these sequences should 50 | -- be treated as the same \"user-level\" character \"A with acute 51 | -- accent\". When you are searching or comparing text, you must 52 | -- ensure that these two sequences are treated equivalently. In 53 | -- addition, you must handle characters with more than one accent. 54 | -- Sometimes the order of a character's combining accents is 55 | -- significant, while in other cases accent sequences in different 56 | -- orders are really equivalent. 57 | -- 58 | -- Similarly, the string \"ffi\" can be encoded as three separate letters: 59 | -- 60 | -- @ 61 | -- 0066 LATIN SMALL LETTER F 62 | -- 0066 LATIN SMALL LETTER F 63 | -- 0069 LATIN SMALL LETTER I 64 | -- @ 65 | -- 66 | -- or as the single character 67 | -- 68 | -- @ 69 | -- FB03 LATIN SMALL LIGATURE FFI 70 | -- @ 71 | -- 72 | -- The \"ffi\" ligature is not a distinct semantic character, and 73 | -- strictly speaking it shouldn't be in Unicode at all, but it was 74 | -- included for compatibility with existing character sets that 75 | -- already provided it. The Unicode standard identifies such 76 | -- characters by giving them \"compatibility\" decompositions into the 77 | -- corresponding semantic characters. When sorting and searching, you 78 | -- will often want to use these mappings. 79 | -- 80 | -- Normalization helps solve these problems by transforming text into 81 | -- the canonical composed and decomposed forms as shown in the first 82 | -- example above. In addition, you can have it perform compatibility 83 | -- decompositions so that you can treat compatibility characters the 84 | -- same as their equivalents. Finally, normalization rearranges accents 85 | -- into the proper canonical order, so that you do not have to worry 86 | -- about accent rearrangement on your own. 87 | -- 88 | -- The W3C generally recommends to exchange texts in 'NFC'. Note also 89 | -- that most legacy character encodings use only precomposed forms and 90 | -- often do not encode any combining marks by themselves. For 91 | -- conversion to such character encodings the Unicode text needs to be 92 | -- normalized to 'NFC'. For more usage examples, see the Unicode 93 | -- Standard Annex. 94 | -- 95 | data NormalizationMode 96 | = NFD -- ^ Canonical decomposition. 97 | | NFKD -- ^ Compatibility decomposition. 98 | | NFC -- ^ Canonical decomposition followed by canonical composition. 99 | | NFKC -- ^ Compatibility decomposition followed by canonical composition. 100 | deriving (Eq, Show, Enum 101 | #if __GLASGOW_HASKELL__ < 912 102 | , Typeable 103 | #endif 104 | ) 105 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016, Harendra Kumar 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | 2. Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | 3. Neither the name of the copyright holder nor the names of its contributors 15 | may be used to endorse or promote products derived from this software without 16 | specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 19 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /MAINTAINING.md: -------------------------------------------------------------------------------- 1 | # Maintainers' Guide 2 | 3 | ## Syncing unicode version 4 | 5 | The test suite uses files included in the UCD. These files should be 6 | synchronized with the version of unicode supported by `unicode-data`. 7 | 8 | `download-ucd-files.sh` downloads the required test files. Replace the `VERSION` 9 | with the current version supported by `unicode-data` and run this from the root 10 | of the project. 11 | 12 | ``` 13 | $ ./download-ucd-files.sh 14 | ``` 15 | 16 | Additionally check for the unicode version in the documentation and make sure it 17 | is eqvivalent to the current version supported by `unicode-data`. 18 | 19 | ## Merge Checklist 20 | 21 | * Check if all the tests pass. 22 | * Check and fix any regression in the benchmarks. 23 | * Update the Changelog if required. 24 | 25 | ## Release Checklist 26 | 27 | * Update the dependency version ranges where applicable. 28 | * (Sync unicode version)[syncing-unicode-version]. 29 | * Bump the upper bound of `text` to the latest stable minor version. 30 | * Make sure to manually run the test suites with "has-icu" flag enabled. It 31 | enables a test suite comparing normalized strings using `unicode-transforms` 32 | vs `libicu`. 33 | * Check if all the tests pass. 34 | * Check and fix any regression in the benchmarks. 35 | * Update the benchmark results table in the README, if any changes impacting 36 | performance have been made. 37 | * Update the latest Changelog accordingly. 38 | -------------------------------------------------------------------------------- /NOTES.md: -------------------------------------------------------------------------------- 1 | # Unicode Resources 2 | 3 | * http://unicode.org/ 4 | * http://www.unicode.org/versions/Unicode9.0.0/ch03.pdf Normalization spec 5 | * http://www.unicode.org/reports/tr15/ UNICODE NORMALIZATION FORMS 6 | * http://www.unicode.org/reports/tr44/ UNICODE CHARACTER DATABASE 7 | * [Unicode Character Database](http://www.unicode.org/Public/UCD/latest/ucd) 8 | 9 | # Unicode related Haskell packages 10 | 11 | ## Casemapping and Casefolding 12 | The `text` package already provides proper unicode casemapping and casefolding 13 | operations. 14 | 15 | ## Additional features in text-icu 16 | 17 | The Haskell package `text-icu` is a full featured implementation of unicode 18 | operations via bindings to the C++ `icu` libraries. 19 | 20 | `text-icu` provides the following additional features: 21 | * Normalization checks 22 | * FCD normalization for collation 23 | * String collation 24 | * Iteration 25 | * Regular expressions 26 | 27 | # Haskell Unicode Landscape 28 | 29 | Unicode functionality in Haskell is fragmented across various packages. The 30 | most comprehensive functionality is provided by `text-icu` which is based on 31 | the `icu` C++ libraries. All related packages are listed here, they may or may 32 | not be up to date or useful. 33 | 34 | * [text-icu](https://stackage.org/lts/package/text-icu) 35 | 36 | ## Basic 37 | 38 | * [base](https://www.stackage.org/lts/package/base) Data.Char module 39 | * [charset](https://www.stackage.org/lts/package/charset) Fast unicode character sets 40 | 41 | ## Unicode Character Database 42 | * [unicode-properties](https://hackage.haskell.org/package/unicode-properties) Unicode 3.2.0 character properties 43 | * [hxt-charproperties](http://www.stackage.org/lts/package/hxt-charproperties) Character properties and classes for XML and Unicode 44 | * [unicode-names](http://hackage.haskell.org/package/unicode-names) Unicode 3.2.0 character names 45 | * [unicode](https://hackage.haskell.org/package/unicode) Construct and transform unicode characters 46 | 47 | ## Unicode Strings 48 | ### ByteStrings (UTF8) 49 | * [utf8-string](https://www.stackage.org/lts/package/utf8-string) Support for reading and writing UTF8 Strings 50 | * [utf8-light](https://www.stackage.org/lts/package/utf8-light) Lightweight UTF8 handling 51 | * [hxt-unicode](https://www.stackage.org/lts/package/hxt-unicode) Unicode en-/decoding functions for utf8, iso-latin-\* and other encodings 52 | ### Text (UTF16) 53 | * [text](https://www.stackage.org/lts/package/text) An efficient packed Unicode text type 54 | * [text-normal](https://hackage.haskell.org/package/text-normal) Data types for Unicode-normalized text - depends on text-icu 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unicode Transforms 2 | 3 | [![Hackage](https://img.shields.io/hackage/v/unicode-transforms.svg?style=flat)](https://hackage.haskell.org/package/unicode-transforms) 4 | [![Build Status](https://travis-ci.com/composewell/unicode-transforms.svg?branch=master)](https://travis-ci.com/composewell/unicode-transforms) 5 | [![Windows Build status](https://ci.appveyor.com/api/projects/status/5wov8m1m0asvbv32?svg=true)](https://ci.appveyor.com/project/harendra-kumar/unicode-transforms) 6 | [![Coverage Status](https://coveralls.io/repos/composewell/unicode-transforms/badge.svg?branch=master&service=github)](https://coveralls.io/github/composewell/unicode-transforms?branch=master) 7 | 8 | Fast Unicode 14.0.0 normalization in Haskell (NFC, NFKC, NFD, NFKD). 9 | 10 | ## What is normalization? 11 | 12 | Unicode characters with adornments (e.g. Á) can be represented in two different 13 | forms, as a single composed character (U+00C1 = Á) or as multiple decomposed 14 | characters (U+0041(A) U+0301( ́ ) = Á). They are differently encoded byte 15 | sequences but for humans they have exactly the same visual appearance. 16 | 17 | A regular byte comparison may tell that two strings are different even though 18 | they might be equivalent. We need to convert both the strings in a 19 | [`normalized`](http://unicode.org/reports/tr15/) form using the [Unicode 20 | Character Database](http://www.unicode.org/Public/UCD/latest/) before we can 21 | compare them for equivalence. For example: 22 | ``` 23 | >> import Data.Text.Normalize 24 | >> normalize NFC "\193" == normalize NFC "\65\769" 25 | True 26 | ``` 27 | 28 | ## Performance 29 | 30 | Normalization performance comparison of this package (v0.3.7) with 31 | the [text-icu](http://hackage.haskell.org/package/text-icu) package 32 | using the [ICU C++ library](http://site.icu-project.org/download) 33 | version ICU4C 65.1 on macOS. The benchmarks compare the time taken in 34 | milliseconds to normalize files in different languages and normalization 35 | forms using both the packages. In most cases `unicode-transforms` 36 | outperforms ICU. 37 | 38 | ``` 39 | Benchmark unicode-transforms(ms) ICU(ms) % Diff 40 | --------------- ---------------------- ------- -------- 41 | NFKD/Korean 7.78 37.10 +376.87 42 | NFD/Korean 7.86 37.06 +371.50 43 | NFKD/Vietnamese 6.85 12.48 +82.20 44 | NFKD/Deutsch 2.17 3.55 +63.30 45 | NFKD/English 1.71 2.78 +62.30 46 | NFKC/Korean 4.77 7.65 +60.28 47 | NFD/Deutsch 2.24 3.53 +57.41 48 | NFD/English 1.76 2.77 +57.32 49 | NFC/Vietnamese 10.66 16.63 +56.00 50 | NFKC/Vietnamese 10.95 16.58 +51.43 51 | NFD/Devanagari 6.48 8.68 +34.10 52 | NFC/Devanagari 6.77 8.49 +25.48 53 | NFD/AllChars 6.18 7.41 +19.91 54 | NFD/Japanese 7.80 9.20 +17.99 55 | NFKC/Devanagari 7.33 8.48 +15.74 56 | NFKD/Japanese 8.71 10.05 +15.39 57 | NFD/Vietnamese 5.94 6.83 +14.99 58 | NFKD/Devanagari 7.59 8.68 +14.27 59 | NFKD/AllChars 9.80 10.66 +8.82 60 | NFKC/Deutsch 3.21 3.18 -0.72 61 | NFC/Korean 4.62 4.38 -5.35 62 | NFKC/English 2.21 2.06 -6.88 63 | NFC/English 2.19 2.04 -7.21 64 | NFKC/AllChars 14.67 9.75 -50.51 65 | NFC/Deutsch 3.02 1.95 -54.39 66 | NFKC/Japanese 12.46 5.42 -129.93 67 | NFC/AllChars 9.72 3.58 -171.63 68 | NFC/Japanese 11.90 3.04 -292.04 69 | ``` 70 | 71 | ## Talks 72 | 73 | * Talks: [Functional Conf 2018 Video](https://www.youtube.com/watch?v=aJvwORrBJ0o) | [Functional Conf 2018 Slides](https://www.slideshare.net/HarendraKumar10/high-performance-haskell) 74 | 75 | ## Contributing 76 | Please use https://github.com/harendra-kumar/unicode-transforms to raise 77 | issues, or send pull requests. 78 | -------------------------------------------------------------------------------- /Setup.hs: -------------------------------------------------------------------------------- 1 | import Distribution.Simple 2 | main = defaultMain 3 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | # packcheck-0.5.1 2 | # You can use any of the options supported by packcheck as environment 3 | # variables here. See https://github.com/composewell/packcheck for all 4 | # options and their explanation. 5 | 6 | environment: 7 | # ------------------------------------------------------------------------ 8 | # Global options, you can use these per build as well 9 | # ------------------------------------------------------------------------ 10 | global: 11 | # ------------------------------------------------------------------------ 12 | # Common options 13 | # ------------------------------------------------------------------------ 14 | # GHC_OPTIONS: "-Werror" 15 | CABAL_REINIT_CONFIG: "y" 16 | LC_ALL: "C.UTF-8" 17 | 18 | # ------------------------------------------------------------------------ 19 | # What to build 20 | # ------------------------------------------------------------------------ 21 | # DISABLE_TEST: "y" 22 | # DISABLE_BENCH: "y" 23 | # DISABLE_DOCS: "y" 24 | DISABLE_SDIST_BUILD: "y" 25 | # DISABLE_SDIST_GIT_CHECK: "y" 26 | # DISABLE_DIST_CHECKS: "y" 27 | DISABLE_SDIST_PROJECT_CHECK: "y" 28 | 29 | # ------------------------------------------------------------------------ 30 | # stack options 31 | # ------------------------------------------------------------------------ 32 | # Note requiring a specific version of stack using STACKVER may fail due to 33 | # github API limit while checking and upgrading/downgrading to the specific 34 | # version. 35 | #STACKVER: "1.6.5" 36 | STACK_UPGRADE: "y" 37 | RESOLVER: "lts-18.18" 38 | STACK_ROOT: "c:\\sr" 39 | 40 | # ------------------------------------------------------------------------ 41 | # cabal options 42 | # ------------------------------------------------------------------------ 43 | CABAL_CHECK_RELAX: "y" 44 | CABAL_HACKAGE_MIRROR: "hackage.haskell.org:http://hackage.fpcomplete.com" 45 | 46 | # ------------------------------------------------------------------------ 47 | # Where to find the required tools 48 | # ------------------------------------------------------------------------ 49 | PATH: "%PATH%;%APPDATA%\\local\\bin" 50 | LOCAL_BIN: "%APPDATA%\\local\\bin" 51 | 52 | # ------------------------------------------------------------------------ 53 | # Location of packcheck.sh (the shell script invoked to perform CI tests ). 54 | # ------------------------------------------------------------------------ 55 | # You can either commit the packcheck.sh script at this path in your repo or 56 | # you can use it by specifying the PACKCHECK_REPO_URL option below in which 57 | # case it will be automatically copied from the packcheck repo to this path 58 | # during CI tests. In any case it is finally invoked from this path. 59 | PACKCHECK_LOCAL_PATH: "./packcheck.sh" 60 | # If you have not committed packcheck.sh in your repo at PACKCHECK_LOCAL_PATH 61 | # then it is automatically pulled from this URL. 62 | PACKCHECK_GITHUB_URL: "https://raw.githubusercontent.com/composewell/packcheck" 63 | PACKCHECK_GITHUB_COMMIT: "37bbe8a79ad5136e654e48e03ec519060a5b11e6" 64 | 65 | # Override the temp directory to avoid sed escaping issues 66 | # See https://github.com/haskell/cabal/issues/5386 67 | TMP: "c:\\tmp" 68 | 69 | cache: 70 | - "%STACK_ROOT%" 71 | - "%LOCAL_BIN%" 72 | - "%APPDATA%\\cabal" 73 | - "%APPDATA%\\ghc" 74 | # - "%LOCALAPPDATA%\\Programs\\stack" 75 | 76 | clone_folder: "c:\\pkg" 77 | build: off 78 | 79 | before_test: 80 | - if not exist %PACKCHECK_LOCAL_PATH% curl -sSkL -o%PACKCHECK_LOCAL_PATH% %PACKCHECK_GITHUB_URL%/%PACKCHECK_GITHUB_COMMIT%/packcheck.sh 81 | - if not exist %LOCAL_BIN% mkdir %LOCAL_BIN% 82 | - where stack.exe || curl -sSkL -ostack.zip http://www.stackage.org/stack/windows-x86_64 && 7z x stack.zip stack.exe && move stack.exe %LOCAL_BIN% 83 | - if defined STACKVER (stack upgrade --binary-only --binary-version %STACKVER%) else (stack upgrade --binary-only || ver > nul) 84 | - stack --version 85 | 86 | test_script: 87 | - stack setup > nul 88 | - for /f "usebackq tokens=*" %%i in (`where 7z.exe`) do set PATH7Z=%%i\.. 89 | - for /f "usebackq tokens=*" %%i in (`where git.exe`) do set PATHGIT=%%i\.. 90 | - chcp 65001 && stack exec bash -- -c "chmod +x %PACKCHECK_LOCAL_PATH%; %PACKCHECK_LOCAL_PATH% stack PATH=/usr/bin:\"%PATH7Z%\":\"%PATHGIT%\"" 91 | -------------------------------------------------------------------------------- /benchmark/Benchmark.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP #-} 2 | {-# LANGUAGE TemplateHaskell #-} 3 | 4 | -- | 5 | -- Copyright : (c) 2016 Harendra Kumar 6 | -- 7 | -- License : BSD-3-Clause 8 | -- Maintainer : harendra.kumar@gmail.com 9 | -- Stability : experimental 10 | -- Portability : GHC 11 | -- 12 | 13 | #if !MIN_VERSION_base(4,8,0) 14 | import Control.Applicative ((<$>), (<*>)) 15 | #endif 16 | import Control.DeepSeq (NFData) 17 | import Data.Text (Text) 18 | import Path (Dir, Path, Rel, mkRelDir, toFilePath, ()) 19 | import Path.IO (listDir) 20 | import System.FilePath (dropExtensions, takeFileName) 21 | 22 | import Gauge.Main (Benchmark, bench, bgroup, defaultMain, env, nf) 23 | 24 | import qualified Data.Text as T 25 | import qualified Data.Text.Normalize as UTText 26 | 27 | #ifdef BENCH_ICU 28 | #if MIN_VERSION_text_icu(0,8,0) 29 | import qualified Data.Text.ICU.Normalize2 as TI 30 | #else 31 | import qualified Data.Text.ICU as TI 32 | #endif 33 | 34 | textICUFuncs :: [(String, Text -> Text)] 35 | textICUFuncs = 36 | [ ("NFD", TI.normalize TI.NFD) 37 | , ("NFKD", TI.normalize TI.NFKD) 38 | , ("NFC", TI.normalize TI.NFC) 39 | , ("NFKC", TI.normalize TI.NFKC) 40 | ] 41 | #endif 42 | 43 | unicodeTransformTextFuncs :: [(String, Text -> Text)] 44 | unicodeTransformTextFuncs = 45 | [ ("NFD", UTText.normalize UTText.NFD) 46 | , ("NFKD", UTText.normalize UTText.NFKD) 47 | , ("NFC", UTText.normalize UTText.NFC) 48 | , ("NFKC", UTText.normalize UTText.NFKC) 49 | ] 50 | 51 | dataDir :: Path Rel Dir 52 | dataDir = $(mkRelDir "benchmark") $(mkRelDir "data") 53 | 54 | -- Truncate or expand all datasets to this size to provide a normalized 55 | -- measurement view across all datasets and to reduce the effect of noise 56 | -- because of the datasets being too small. 57 | dataSetSize :: Int 58 | dataSetSize = 1000000 59 | 60 | makeBench :: (NFData a, NFData b) => (String, a -> b) -> (String, IO a) -> Benchmark 61 | makeBench (implName, func) (dataName, setup) = 62 | env setup (\txt -> bench (implName ++ "/" ++ dataName) (nf func txt)) 63 | 64 | strInput :: FilePath -> (String, IO String) 65 | strInput file = (dataName file, 66 | fmap (take dataSetSize . cycle) (readFile file)) 67 | where dataName = dropExtensions . takeFileName 68 | 69 | txtInput :: FilePath -> (String, IO Text) 70 | txtInput file = second (fmap T.pack) (strInput file) 71 | where second f (a, b) = (a, f b) 72 | 73 | main :: IO () 74 | main = do 75 | dataFiles <- fmap (map toFilePath . snd) (listDir dataDir) 76 | defaultMain $ 77 | [ 78 | #ifdef BENCH_ICU 79 | bgroup "text-icu" 80 | $ makeBench <$> textICUFuncs <*> (map txtInput dataFiles) 81 | , 82 | #endif 83 | bgroup "unicode-transforms-text" 84 | $ makeBench <$> unicodeTransformTextFuncs 85 | <*> (map txtInput dataFiles) 86 | ] 87 | -------------------------------------------------------------------------------- /benchmark/Chart.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE TupleSections #-} 2 | {-# LANGUAGE RecordWildCards #-} 3 | {-# LANGUAGE ScopedTypeVariables #-} 4 | 5 | module Main where 6 | 7 | import BenchShow 8 | import Data.List 9 | 10 | selectBench 11 | :: (SortColumn -> Maybe GroupStyle -> Either String [(String, Double)]) 12 | -> [String] 13 | selectBench f = 14 | reverse 15 | $ fmap fst 16 | $ either 17 | (const 18 | $ either error (sortOn snd) 19 | $ f (ColumnIndex 0) (Just PercentDiff)) 20 | (sortOn snd) 21 | $ f (ColumnIndex 1) (Just PercentDiff) 22 | 23 | main :: IO () 24 | main = do 25 | let cfg = defaultConfig 26 | { classifyBenchmark = \bs -> 27 | case stripPrefix "text-icu/" bs of 28 | Just x -> Just ("ICU", x) 29 | Nothing -> 30 | case stripPrefix "unicode-transforms-text/" bs of 31 | Just x -> Just ("unicode-transforms",x) 32 | Nothing -> error "unknown benchmark" 33 | , selectBenchmarks = selectBench 34 | , selectGroups = \gs -> 35 | filterGroup "unicode-transforms" gs ++ filterGroup "ICU" gs 36 | , presentation = Groups Absolute 37 | } 38 | -- graph "results.csv" "unicode-graph" cfg 39 | report "results.csv" Nothing cfg 40 | 41 | where 42 | 43 | filterGroup grp gs = filter (\(name,_) -> name == grp) gs 44 | -------------------------------------------------------------------------------- /benchmark/NormalizeFile.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE TemplateHaskell #-} 2 | 3 | -- | 4 | -- Copyright : (c) 2016 Harendra Kumar 5 | -- 6 | -- License : BSD-3-Clause 7 | -- Maintainer : harendra.kumar@gmail.com 8 | -- Stability : experimental 9 | -- Portability : GHC 10 | -- 11 | 12 | import Control.DeepSeq (deepseq) 13 | import System.Environment (getArgs) 14 | 15 | import qualified Data.Text.Normalize as UT 16 | import Data.Text (pack, Text) 17 | 18 | -- Truncate or expand all datasets to this size to provide a normalized 19 | -- measurement view across all datasets and to reduce the effect of noise 20 | -- because of the datasets being too small. 21 | dataSetSize :: Int 22 | dataSetSize = 1000000 23 | 24 | txtInput :: FilePath -> IO Text 25 | txtInput file = fmap (pack . take dataSetSize . cycle) (readFile file) 26 | 27 | main :: IO () 28 | main = do 29 | [file] <- getArgs 30 | input <- txtInput file 31 | UT.normalize UT.NFD input `deepseq` return () 32 | -------------------------------------------------------------------------------- /benchmark/README.md: -------------------------------------------------------------------------------- 1 | # Comparing benchmarks for regression 2 | 3 | The following commands are tested with `cabal` version 3.0. 4 | 5 | Run the benchmarks for the baseline code i.e. without the changes: 6 | 7 | ``` 8 | # Remove any old benchmark results file first 9 | $ rm results.csv 10 | $ cabal run bench -- --csvraw=results.csv --quick 11 | ``` 12 | 13 | It will collect the benchmark results in `results.csv` file. 14 | 15 | Now repeat the above step for the new code i.e. with the changes. 16 | It will append the new benchmarks results to the existing `results.csv` file. 17 | 18 | If you want more accurate benchmark results remove the `--quick` flag. 19 | 20 | To generate a benchmark comparison between old and new changes from the 21 | benchmark results in `results.csv` file: 22 | 23 | ``` 24 | # [NOTE] The path "results.csv" is harcoded in the chart executable. 25 | $ cabal run chart --flag bench-show 26 | ``` 27 | 28 | # Comparing with ICU (text-icu package) 29 | 30 | Install the icu library: 31 | 32 | ``` 33 | # On Mac OS using MacPorts 34 | $ sudo port install icu 35 | 36 | # On Mac OS using brew 37 | $ brew install icu4c 38 | 39 | # On Debian Linux based distributions (the library version suffix may differ) 40 | $ sudo apt-get install libicu65 41 | ``` 42 | 43 | If cabal cannot automatically find the icu library (e.g. when installed 44 | via macports install) then use explicit `LIBRARY_PATH` to tell it where 45 | the library is: 46 | 47 | ``` 48 | $ export LIBRARY_PATH=/usr/lib/:/opt/local/lib 49 | 50 | # Alternatively, pass the lib and include path as follows 51 | $ cabal bench --extra-lib-dirs=/usr/local/opt/icu4c/lib --extra-include-dirs=/usr/local/opt/icu4c/include 52 | ``` 53 | 54 | Remove any old `results.csv` and run benchmarks with `has-icu` flag enabled: 55 | 56 | ``` 57 | $ rm results.csv 58 | $ cabal run bench --flag has-icu -- --csvraw=results.csv --quick 59 | ``` 60 | 61 | The following command will now show the comparison between `text-icu` and 62 | `unicode-transforms`: 63 | 64 | ``` 65 | $ cabal run chart --flag bench-show 66 | ``` 67 | -------------------------------------------------------------------------------- /benchmark/data/AllChars.txt: -------------------------------------------------------------------------------- 1 | This page contains characters from each of the Unicode character blocks. 2 | 3 | Basic Latin 4 | ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 5 | Latin-1 Supplement 6 | ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ 7 | Latin Extended-A 8 | Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ Ő ő Œ œ Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ 9 | Latin Extended-B 10 | ƀ Ɓ Ƃ ƃ Ƅ ƅ Ɔ Ƈ ƈ Ɖ Ɗ Ƌ ƌ ƍ Ǝ Ə Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ ƙ ƚ ƛ Ɯ Ɲ ƞ Ɵ Ơ ơ Ƣ ƣ Ƥ ƥ Ʀ Ƨ ƨ Ʃ ƪ ƫ Ƭ ƭ Ʈ Ư ư Ʊ Ʋ Ƴ ƴ Ƶ ƶ Ʒ Ƹ ƹ ƺ ƻ Ƽ ƽ ƾ ƿ ǀ ǁ ǂ ǃ DŽ Dž dž LJ Lj lj NJ Nj nj Ǎ ǎ Ǐ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ Ǘ ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ ǡ Ǣ ǣ Ǥ ǥ Ǧ ǧ Ǩ ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ DZ Dz dz Ǵ ǵ Ƕ Ƿ Ǹ ǹ Ǻ ǻ Ǽ ǽ Ǿ ǿ ... 11 | IPA Extensions 12 | ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ ʩ ʪ ʫ ʬ ʭ 13 | Spacing Modifier Letters 14 | ʰ ʱ ʲ ʳ ʴ ʵ ʶ ʷ ʸ ʹ ʺ ʻ ʼ ʽ ʾ ʿ ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˌ ˍ ˎ ˏ ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˚ ˛ ˜ ˝ ˞ ˟ ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩ ˪ ˫ ˬ ˭ ˮ 15 | Combining Diacritical Marks 16 | ̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̍ ̎ ̏ ̐ ̑ ̒ ̓ ̔ ̕ ̖ ̗ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟ ̠ ̡ ̢ ̣ ̤ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ ̰ ̱ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿ ̀ ́ ͂ ̓ ̈́ ͅ ͆ ͇ ͈ ͉ ͊ ͋ ͌ ͍ ͎ ͏ ͠ ͡ ͢ ͣ ͤ ͥ ͦ ͧ ͨ ͩ ͪ ͫ ͬ ͭ ͮ ͯ 17 | Greek and Coptic 18 | ʹ ͵ ͺ ; ΄ ΅ Ά · Έ Ή Ί Ό Ύ Ώ ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ί ΰ α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ ϐ ϑ ϒ ϓ ϔ ϕ ϖ ϗ Ϙ ϙ Ϛ ϛ Ϝ ϝ Ϟ ϟ Ϡ ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ ϴ ϵ ϶ 19 | Cyrillic 20 | Ѐ Ё Ђ Ѓ Є Ѕ І Ї Ј Љ Њ Ћ Ќ Ѝ Ў Џ А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я ѐ ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ѝ ў џ Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ ... 21 | Cyrillic Supplementary 22 | Ԁ ԁ Ԃ ԃ Ԅ ԅ Ԇ ԇ Ԉ ԉ Ԋ ԋ Ԍ ԍ Ԏ ԏ 23 | Armenian 24 | Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ Ճ Մ Յ Ն Շ Ո Չ Պ Ջ Ռ Ս Վ Տ Ր Ց Ւ Փ Ք Օ Ֆ ՙ ՚ ՛ ՜ ՝ ՞ ՟ ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ ր ց ւ փ ք օ ֆ և ։ ֊ 25 | Hebrew 26 | ֑ ֒ ֓ ֔ ֕ ֖ ֗ ֘ ֙ ֚ ֛ ֜ ֝ ֞ ֟ ֠ ֡ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ֪ ֫ ֬ ֭ ֮ ֯ ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֻ ּ ֽ ־ ֿ ׀ ׁ ׂ ׃ ׄ א ב ג ד ה ו ז ח ט י ך כ ל ם מ ן נ ס ע ף פ ץ צ ק ר ש ת װ ױ ײ ׳ ״ 27 | Arabic 28 | ، ؛ ؟ ء آ أ ؤ إ ئ ا ب ة ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ـ ف ق ك ل م ن ه و ى ي ً ٌ ٍ َ ُ ِ ّ ْ ٓ ٔ ٕ ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ٪ ٫ ٬ ٭ ٮ ٯ ٰ ٱ ٲ ٳ ٴ ٵ ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ ڀ ځ ڂ ڃ ڄ څ چ ڇ ڈ ډ ڊ ڋ ڌ ڍ ڎ ڏ ڐ ڑ ڒ ړ ڔ ڕ ږ ڗ ژ ڙ ښ ڛ ڜ ڝ ڞ ڟ ڠ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک ڪ ګ ڬ ... 29 | Syriac 30 | ܀ ܁ ܂ ܃ ܄ ܅ ܆ ܇ ܈ ܉ ܊ ܋ ܌ ܍ ܏ ܐ ܑ ܒ ܓ ܔ ܕ ܖ ܗ ܘ ܙ ܚ ܛ ܜ ܝ ܞ ܟ ܠ ܡ ܢ ܣ ܤ ܥ ܦ ܧ ܨ ܩ ܪ ܫ ܬ ܰ ܱ ܲ ܳ ܴ ܵ ܶ ܷ ܸ ܹ ܺ ܻ ܼ ܽ ܾ ܿ ݀ ݁ ݂ ݃ ݄ ݅ ݆ ݇ ݈ ݉ ݊ 31 | Thaana 32 | ހ ށ ނ ރ ބ ޅ ކ އ ވ މ ފ ދ ތ ލ ގ ޏ ސ ޑ ޒ ޓ ޔ ޕ ޖ ޗ ޘ ޙ ޚ ޛ ޜ ޝ ޞ ޟ ޠ ޡ ޢ ޣ ޤ ޥ ަ ާ ި ީ ު ޫ ެ ޭ ޮ ޯ ް ޱ 33 | Devanagari 34 | ँ ं ः अ आ इ ई उ ऊ ऋ ऌ ऍ ऎ ए ऐ ऑ ऒ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न ऩ प फ ब भ म य र ऱ ल ळ ऴ व श ष स ह ़ ऽ ा ि ी ु ू ृ ॄ ॅ ॆ े ै ॉ ॊ ो ौ ् ॐ ॑ ॒ ॓ ॔ क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़ ॠ ॡ ॢ ॣ । ॥ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॰ 35 | Bengali 36 | ঁ ং ঃ অ আ ই ঈ উ ঊ ঋ ঌ এ ঐ ও ঔ ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ ম য র ল শ ষ স হ ় া ি ী ু ূ ৃ ৄ ে ৈ ো ৌ ্ ৗ ড় ঢ় য় ৠ ৡ ৢ ৣ ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ ৰ ৱ ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৺ 37 | Gurmukhi 38 | ਂ ਅ ਆ ਇ ਈ ਉ ਊ ਏ ਐ ਓ ਔ ਕ ਖ ਗ ਘ ਙ ਚ ਛ ਜ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਬ ਭ ਮ ਯ ਰ ਲ ਲ਼ ਵ ਸ਼ ਸ ਹ ਼ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ ੍ ਖ਼ ਗ਼ ਜ਼ ੜ ਫ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੰ ੱ ੲ ੳ ੴ 39 | Gujarati 40 | ઁ ં ઃ અ આ ઇ ઈ ઉ ઊ ઋ ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ ળ વ શ ષ સ હ ઼ ઽ ા િ ી ુ ૂ ૃ ૄ ૅ ે ૈ ૉ ો ૌ ્ ૐ ૠ ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯ 41 | Oriya 42 | ଁ ଂ ଃ ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଌ ଏ ଐ ଓ ଔ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଢ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ର ଲ ଳ ଶ ଷ ସ ହ ଼ ଽ ା ି ୀ ୁ ୂ ୃ େ ୈ ୋ ୌ ୍ ୖ ୗ ଡ଼ ଢ଼ ୟ ୠ ୡ ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯ ୰ 43 | Tamil 44 | ஂ ஃ அ ஆ இ ஈ உ ஊ எ ஏ ஐ ஒ ஓ ஔ க ங ச ஜ ஞ ட ண த ந ன ப ம ய ர ற ல ள ழ வ ஷ ஸ ஹ ா ி ீ ு ூ ெ ே ை ொ ோ ௌ ் ௗ ௧ ௨ ௩ ௪ ௫ ௬ ௭ ௮ ௯ ௰ ௱ ௲ 45 | Telugu 46 | ఁ ం ః అ ఆ ఇ ఈ ఉ ఊ ఋ ఌ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల ళ వ శ ష స హ ా ి ీ ు ూ ృ ౄ ె ే ై ొ ో ౌ ్ ౕ ౖ ౠ ౡ ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯ 47 | Kannada 48 | ಂ ಃ ಅ ಆ ಇ ಈ ಉ ಊ ಋ ಌ ಎ ಏ ಐ ಒ ಓ ಔ ಕ ಖ ಗ ಘ ಙ ಚ ಛ ಜ ಝ ಞ ಟ ಠ ಡ ಢ ಣ ತ ಥ ದ ಧ ನ ಪ ಫ ಬ ಭ ಮ ಯ ರ ಱ ಲ ಳ ವ ಶ ಷ ಸ ಹ ಾ ಿ ೀ ು ೂ ೃ ೄ ೆ ೇ ೈ ೊ ೋ ೌ ್ ೕ ೖ ೞ ೠ ೡ ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯ 49 | Malayalam 50 | ം ഃ അ ആ ഇ ഈ ഉ ഊ ഋ ഌ എ ഏ ഐ ഒ ഓ ഔ ക ഖ ഗ ഘ ങ ച ഛ ജ ഝ ഞ ട ഠ ഡ ഢ ണ ത ഥ ദ ധ ന പ ഫ ബ ഭ മ യ ര റ ല ള ഴ വ ശ ഷ സ ഹ ാ ി ീ ു ൂ ൃ െ േ ൈ ൊ ോ ൌ ് ൗ ൠ ൡ ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯ 51 | Sinhala 52 | ං ඃ අ ආ ඇ ඈ ඉ ඊ උ ඌ ඍ ඎ ඏ ඐ එ ඒ ඓ ඔ ඕ ඖ ක ඛ ග ඝ ඞ ඟ ච ඡ ජ ඣ ඤ ඥ ඦ ට ඨ ඩ ඪ ණ ඬ ත ථ ද ධ න ඳ ප ඵ බ භ ම ඹ ය ර ල ව ශ ෂ ස හ ළ ෆ ් ා ැ ෑ ි ී ු ූ ෘ ෙ ේ ෛ ො ෝ ෞ ෟ ෲ ෳ ෴ 53 | Thai 54 | ก ข ฃ ค ฅ ฆ ง จ ฉ ช ซ ฌ ญ ฎ ฏ ฐ ฑ ฒ ณ ด ต ถ ท ธ น บ ป ผ ฝ พ ฟ ภ ม ย ร ฤ ล ฦ ว ศ ษ ส ห ฬ อ ฮ ฯ ะ ั า ำ ิ ี ึ ื ุ ู ฺ ฿ เ แ โ ใ ไ ๅ ๆ ็ ่ ้ ๊ ๋ ์ ํ ๎ ๏ ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙ ๚ ๛ 55 | Lao 56 | ກ ຂ ຄ ງ ຈ ຊ ຍ ດ ຕ ຖ ທ ນ ບ ປ ຜ ຝ ພ ຟ ມ ຢ ຣ ລ ວ ສ ຫ ອ ຮ ຯ ະ ັ າ ຳ ິ ີ ຶ ື ຸ ູ ົ ຼ ຽ ເ ແ ໂ ໃ ໄ ໆ ່ ້ ໊ ໋ ໌ ໍ ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙ ໜ ໝ 57 | Tibetan 58 | ༀ ༁ ༂ ༃ ༄ ༅ ༆ ༇ ༈ ༉ ༊ ་ ༌ ། ༎ ༏ ༐ ༑ ༒ ༓ ༔ ༕ ༖ ༗ ༘ ༙ ༚ ༛ ༜ ༝ ༞ ༟ ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ ༪ ༫ ༬ ༭ ༮ ༯ ༰ ༱ ༲ ༳ ༴ ༵ ༶ ༷ ༸ ༹ ༺ ༻ ༼ ༽ ༾ ༿ ཀ ཁ ག གྷ ང ཅ ཆ ཇ ཉ ཊ ཋ ཌ ཌྷ ཎ ཏ ཐ ད དྷ ན པ ཕ བ བྷ མ ཙ ཚ ཛ ཛྷ ཝ ཞ ཟ འ ཡ ར ལ ཤ ཥ ས ཧ ཨ ཀྵ ཪ ཱ ི ཱི ུ ཱུ ྲྀ ཷ ླྀ ཹ ེ ཻ ོ ཽ ཾ ཿ ྀ ཱྀ ྂ ྃ ྄ ྅ ྆ ... 59 | Myanmar 60 | က ခ ဂ ဃ င စ ဆ ဇ ဈ ဉ ည ဋ ဌ ဍ ဎ ဏ တ ထ ဒ ဓ န ပ ဖ ဗ ဘ မ ယ ရ လ ဝ သ ဟ ဠ အ ဣ ဤ ဥ ဦ ဧ ဩ ဪ ာ ိ ီ ု ူ ေ ဲ ံ ့ း ္ ၀ ၁ ၂ ၃ ၄ ၅ ၆ ၇ ၈ ၉ ၊ ။ ၌ ၍ ၎ ၏ ၐ ၑ ၒ ၓ ၔ ၕ ၖ ၗ ၘ ၙ 61 | Georgian 62 | Ⴀ Ⴁ Ⴂ Ⴃ Ⴄ Ⴅ Ⴆ Ⴇ Ⴈ Ⴉ Ⴊ Ⴋ Ⴌ Ⴍ Ⴎ Ⴏ Ⴐ Ⴑ Ⴒ Ⴓ Ⴔ Ⴕ Ⴖ Ⴗ Ⴘ Ⴙ Ⴚ Ⴛ Ⴜ Ⴝ Ⴞ Ⴟ Ⴠ Ⴡ Ⴢ Ⴣ Ⴤ Ⴥ ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ ჱ ჲ ჳ ჴ ჵ ჶ ჷ ჸ ჻ 63 | Hangul Jamo 64 | ᄀ ᄁ ᄂ ᄃ ᄄ ᄅ ᄆ ᄇ ᄈ ᄉ ᄊ ᄋ ᄌ ᄍ ᄎ ᄏ ᄐ ᄑ ᄒ ᄓ ᄔ ᄕ ᄖ ᄗ ᄘ ᄙ ᄚ ᄛ ᄜ ᄝ ᄞ ᄟ ᄠ ᄡ ᄢ ᄣ ᄤ ᄥ ᄦ ᄧ ᄨ ᄩ ᄪ ᄫ ᄬ ᄭ ᄮ ᄯ ᄰ ᄱ ᄲ ᄳ ᄴ ᄵ ᄶ ᄷ ᄸ ᄹ ᄺ ᄻ ᄼ ᄽ ᄾ ᄿ ᅀ ᅁ ᅂ ᅃ ᅄ ᅅ ᅆ ᅇ ᅈ ᅉ ᅊ ᅋ ᅌ ᅍ ᅎ ᅏ ᅐ ᅑ ᅒ ᅓ ᅔ ᅕ ᅖ ᅗ ᅘ ᅙ ᅟ ᅠ ᅡ ᅢ ᅣ ᅤ ᅥ ᅦ ᅧ ᅨ ᅩ ᅪ ᅫ ᅬ ᅭ ᅮ ᅯ ᅰ ᅱ ᅲ ᅳ ᅴ ᅵ ᅶ ᅷ ᅸ ᅹ ᅺ ᅻ ᅼ ᅽ ᅾ ᅿ ᆀ ᆁ ᆂ ᆃ ᆄ ... 65 | Ethiopic 66 | ሀ ሁ ሂ ሃ ሄ ህ ሆ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቈ ቊ ቋ ቌ ቍ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቛ ቜ ቝ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኈ ኊ ... 67 | Cherokee 68 | Ꭰ Ꭱ Ꭲ Ꭳ Ꭴ Ꭵ Ꭶ Ꭷ Ꭸ Ꭹ Ꭺ Ꭻ Ꭼ Ꭽ Ꭾ Ꭿ Ꮀ Ꮁ Ꮂ Ꮃ Ꮄ Ꮅ Ꮆ Ꮇ Ꮈ Ꮉ Ꮊ Ꮋ Ꮌ Ꮍ Ꮎ Ꮏ Ꮐ Ꮑ Ꮒ Ꮓ Ꮔ Ꮕ Ꮖ Ꮗ Ꮘ Ꮙ Ꮚ Ꮛ Ꮜ Ꮝ Ꮞ Ꮟ Ꮠ Ꮡ Ꮢ Ꮣ Ꮤ Ꮥ Ꮦ Ꮧ Ꮨ Ꮩ Ꮪ Ꮫ Ꮬ Ꮭ Ꮮ Ꮯ Ꮰ Ꮱ Ꮲ Ꮳ Ꮴ Ꮵ Ꮶ Ꮷ Ꮸ Ꮹ Ꮺ Ꮻ Ꮼ Ꮽ Ꮾ Ꮿ Ᏸ Ᏹ Ᏺ Ᏻ Ᏼ 69 | Unified Canadian Aboriginal Syllabics 70 | ᐁ ᐂ ᐃ ᐄ ᐅ ᐆ ᐇ ᐈ ᐉ ᐊ ᐋ ᐌ ᐍ ᐎ ᐏ ᐐ ᐑ ᐒ ᐓ ᐔ ᐕ ᐖ ᐗ ᐘ ᐙ ᐚ ᐛ ᐜ ᐝ ᐞ ᐟ ᐠ ᐡ ᐢ ᐣ ᐤ ᐥ ᐦ ᐧ ᐨ ᐩ ᐪ ᐫ ᐬ ᐭ ᐮ ᐯ ᐰ ᐱ ᐲ ᐳ ᐴ ᐵ ᐶ ᐷ ᐸ ᐹ ᐺ ᐻ ᐼ ᐽ ᐾ ᐿ ᑀ ᑁ ᑂ ᑃ ᑄ ᑅ ᑆ ᑇ ᑈ ᑉ ᑊ ᑋ ᑌ ᑍ ᑎ ᑏ ᑐ ᑑ ᑒ ᑓ ᑔ ᑕ ᑖ ᑗ ᑘ ᑙ ᑚ ᑛ ᑜ ᑝ ᑞ ᑟ ᑠ ᑡ ᑢ ᑣ ᑤ ᑥ ᑦ ᑧ ᑨ ᑩ ᑪ ᑫ ᑬ ᑭ ᑮ ᑯ ᑰ ᑱ ᑲ ᑳ ᑴ ᑵ ᑶ ᑷ ᑸ ᑹ ᑺ ᑻ ᑼ ᑽ ᑾ ᑿ ᒀ ... 71 | Ogham 72 |   ᚁ ᚂ ᚃ ᚄ ᚅ ᚆ ᚇ ᚈ ᚉ ᚊ ᚋ ᚌ ᚍ ᚎ ᚏ ᚐ ᚑ ᚒ ᚓ ᚔ ᚕ ᚖ ᚗ ᚘ ᚙ ᚚ ᚛ ᚜ 73 | Runic 74 | ᚠ ᚡ ᚢ ᚣ ᚤ ᚥ ᚦ ᚧ ᚨ ᚩ ᚪ ᚫ ᚬ ᚭ ᚮ ᚯ ᚰ ᚱ ᚲ ᚳ ᚴ ᚵ ᚶ ᚷ ᚸ ᚹ ᚺ ᚻ ᚼ ᚽ ᚾ ᚿ ᛀ ᛁ ᛂ ᛃ ᛄ ᛅ ᛆ ᛇ ᛈ ᛉ ᛊ ᛋ ᛌ ᛍ ᛎ ᛏ ᛐ ᛑ ᛒ ᛓ ᛔ ᛕ ᛖ ᛗ ᛘ ᛙ ᛚ ᛛ ᛜ ᛝ ᛞ ᛟ ᛠ ᛡ ᛢ ᛣ ᛤ ᛥ ᛦ ᛧ ᛨ ᛩ ᛪ ᛫ ᛬ ᛭ ᛮ ᛯ ᛰ 75 | Tagalog 76 | ᜀ ᜁ ᜂ ᜃ ᜄ ᜅ ᜆ ᜇ ᜈ ᜉ ᜊ ᜋ ᜌ ᜎ ᜏ ᜐ ᜑ ᜒ ᜓ ᜔ 77 | Hanunoo 78 | ᜠ ᜡ ᜢ ᜣ ᜤ ᜥ ᜦ ᜧ ᜨ ᜩ ᜪ ᜫ ᜬ ᜭ ᜮ ᜯ ᜰ ᜱ ᜲ ᜳ ᜴ ᜵ ᜶ 79 | Buhid 80 | ᝀ ᝁ ᝂ ᝃ ᝄ ᝅ ᝆ ᝇ ᝈ ᝉ ᝊ ᝋ ᝌ ᝍ ᝎ ᝏ ᝐ ᝑ ᝒ ᝓ 81 | Tagbanwa 82 | ᝠ ᝡ ᝢ ᝣ ᝤ ᝥ ᝦ ᝧ ᝨ ᝩ ᝪ ᝫ ᝬ ᝮ ᝯ ᝰ ᝲ ᝳ 83 | Khmer 84 | ក ខ គ ឃ ង ច ឆ ជ ឈ ញ ដ ឋ ឌ ឍ ណ ត ថ ទ ធ ន ប ផ ព ភ ម យ រ ល វ ឝ ឞ ស ហ ឡ អ ឣ ឤ ឥ ឦ ឧ ឨ ឩ ឪ ឫ ឬ ឭ ឮ ឯ ឰ ឱ ឲ ឳ ឴ ឵ ា ិ ី ឹ ឺ ុ ូ ួ ើ ឿ ៀ េ ែ ៃ ោ ៅ ំ ះ ៈ ៉ ៊ ់ ៌ ៍ ៎ ៏ ័ ៑ ្ ៓ ។ ៕ ៖ ៗ ៘ ៙ ៚ ៛ ៜ ០ ១ ២ ៣ ៤ ៥ ៦ ៧ ៨ ៩ 85 | Mongolian 86 | ᠀ ᠁ ᠂ ᠃ ᠄ ᠅ ᠆ ᠇ ᠈ ᠉ ᠊ ᠋ ᠌ ᠍ ᠎ ᠐ ᠑ ᠒ ᠓ ᠔ ᠕ ᠖ ᠗ ᠘ ᠙ ᠠ ᠡ ᠢ ᠣ ᠤ ᠥ ᠦ ᠧ ᠨ ᠩ ᠪ ᠫ ᠬ ᠭ ᠮ ᠯ ᠰ ᠱ ᠲ ᠳ ᠴ ᠵ ᠶ ᠷ ᠸ ᠹ ᠺ ᠻ ᠼ ᠽ ᠾ ᠿ ᡀ ᡁ ᡂ ᡃ ᡄ ᡅ ᡆ ᡇ ᡈ ᡉ ᡊ ᡋ ᡌ ᡍ ᡎ ᡏ ᡐ ᡑ ᡒ ᡓ ᡔ ᡕ ᡖ ᡗ ᡘ ᡙ ᡚ ᡛ ᡜ ᡝ ᡞ ᡟ ᡠ ᡡ ᡢ ᡣ ᡤ ᡥ ᡦ ᡧ ᡨ ᡩ ᡪ ᡫ ᡬ ᡭ ᡮ ᡯ ᡰ ᡱ ᡲ ᡳ ᡴ ᡵ ᡶ ᡷ ᢀ ᢁ ᢂ ᢃ ᢄ ᢅ ᢆ ᢇ ᢈ ᢉ ᢊ ᢋ ᢌ ᢍ ᢎ ... 87 | Latin Extended Additional 88 | Ḁ ḁ Ḃ ḃ Ḅ ḅ Ḇ ḇ Ḉ ḉ Ḋ ḋ Ḍ ḍ Ḏ ḏ Ḑ ḑ Ḓ ḓ Ḕ ḕ Ḗ ḗ Ḙ ḙ Ḛ ḛ Ḝ ḝ Ḟ ḟ Ḡ ḡ Ḣ ḣ Ḥ ḥ Ḧ ḧ Ḩ ḩ Ḫ ḫ Ḭ ḭ Ḯ ḯ Ḱ ḱ Ḳ ḳ Ḵ ḵ Ḷ ḷ Ḹ ḹ Ḻ ḻ Ḽ ḽ Ḿ ḿ Ṁ ṁ Ṃ ṃ Ṅ ṅ Ṇ ṇ Ṉ ṉ Ṋ ṋ Ṍ ṍ Ṏ ṏ Ṑ ṑ Ṓ ṓ Ṕ ṕ Ṗ ṗ Ṙ ṙ Ṛ ṛ Ṝ ṝ Ṟ ṟ Ṡ ṡ Ṣ ṣ Ṥ ṥ Ṧ ṧ Ṩ ṩ Ṫ ṫ Ṭ ṭ Ṯ ṯ Ṱ ṱ Ṳ ṳ Ṵ ṵ Ṷ ṷ Ṹ ṹ Ṻ ṻ Ṽ ṽ Ṿ ṿ ... 89 | Greek Extended 90 | ἀ ἁ ἂ ἃ ἄ ἅ ἆ ἇ Ἀ Ἁ Ἂ Ἃ Ἄ Ἅ Ἆ Ἇ ἐ ἑ ἒ ἓ ἔ ἕ Ἐ Ἑ Ἒ Ἓ Ἔ Ἕ ἠ ἡ ἢ ἣ ἤ ἥ ἦ ἧ Ἠ Ἡ Ἢ Ἣ Ἤ Ἥ Ἦ Ἧ ἰ ἱ ἲ ἳ ἴ ἵ ἶ ἷ Ἰ Ἱ Ἲ Ἳ Ἴ Ἵ Ἶ Ἷ ὀ ὁ ὂ ὃ ὄ ὅ Ὀ Ὁ Ὂ Ὃ Ὄ Ὅ ὐ ὑ ὒ ὓ ὔ ὕ ὖ ὗ Ὑ Ὓ Ὕ Ὗ ὠ ὡ ὢ ὣ ὤ ὥ ὦ ὧ Ὠ Ὡ Ὢ Ὣ Ὤ Ὥ Ὦ Ὧ ὰ ά ὲ έ ὴ ή ὶ ί ὸ ό ὺ ύ ὼ ώ ᾀ ᾁ ᾂ ᾃ ᾄ ᾅ ᾆ ᾇ ᾈ ᾉ ᾊ ᾋ ᾌ ᾍ ... 91 | General Punctuation 92 |                       ​ ‌ ‍ ‎ ‏ ‐ ‑ ‒ – — ― ‖ ‗ ‘ ’ ‚ ‛ “ ” „ ‟ † ‡ • ‣ ․ ‥ … ‧ 
 
 ‪ ‫ ‬ ‭ ‮   ‰ ‱ ′ ″ ‴ ‵ ‶ ‷ ‸ ‹ › ※ ‼ ‽ ‾ ‿ ⁀ ⁁ ⁂ ⁃ ⁄ ⁅ ⁆ ⁇ ⁈ ⁉ ⁊ ⁋ ⁌ ⁍ ⁎ ⁏ ⁐ ⁑ ⁒ ⁗   ⁠ ⁡ ⁢ ⁣       93 | Superscripts and Subscripts 94 | ⁰ ⁱ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁼ ⁽ ⁾ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎ 95 | Currency Symbols 96 | ₠ ₡ ₢ ₣ ₤ ₥ ₦ ₧ ₨ ₩ ₪ ₫ € ₭ ₮ ₯ ₰ ₱ 97 | Combining Diacritical Marks for Symbols 98 | ⃐ ⃑ ⃒ ⃓ ⃔ ⃕ ⃖ ⃗ ⃘ ⃙ ⃚ ⃛ ⃜ ⃝ ⃞ ⃟ ⃠ ⃡ ⃢ ⃣ ⃤ ⃥ ⃦ ⃧ ⃨ ⃩ ⃪ 99 | Letterlike Symbols 100 | ℀ ℁ ℂ ℃ ℄ ℅ ℆ ℇ ℈ ℉ ℊ ℋ ℌ ℍ ℎ ℏ ℐ ℑ ℒ ℓ ℔ ℕ № ℗ ℘ ℙ ℚ ℛ ℜ ℝ ℞ ℟ ℠ ℡ ™ ℣ ℤ ℥ Ω ℧ ℨ ℩ K Å ℬ ℭ ℮ ℯ ℰ ℱ Ⅎ ℳ ℴ ℵ ℶ ℷ ℸ ℹ ℺ ℽ ℾ ℿ ⅀ ⅁ ⅂ ⅃ ⅄ ⅅ ⅆ ⅇ ⅈ ⅉ ⅊ ⅋ 101 | Number Forms 102 | ⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ ⅟ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ ↀ ↁ ↂ Ↄ 103 | Arrows 104 | ← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙ ↚ ↛ ↜ ↝ ↞ ↟ ↠ ↡ ↢ ↣ ↤ ↥ ↦ ↧ ↨ ↩ ↪ ↫ ↬ ↭ ↮ ↯ ↰ ↱ ↲ ↳ ↴ ↵ ↶ ↷ ↸ ↹ ↺ ↻ ↼ ↽ ↾ ↿ ⇀ ⇁ ⇂ ⇃ ⇄ ⇅ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌ ⇍ ⇎ ⇏ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⇚ ⇛ ⇜ ⇝ ⇞ ⇟ ⇠ ⇡ ⇢ ⇣ ⇤ ⇥ ⇦ ⇧ ⇨ ⇩ ⇪ ⇫ ⇬ ⇭ ⇮ ⇯ ⇰ ⇱ ⇲ ⇳ ⇴ ⇵ ⇶ ⇷ ⇸ ⇹ ⇺ ⇻ ⇼ ⇽ ⇾ ⇿ 105 | Mathematical Operators 106 | ∀ ∁ ∂ ∃ ∄ ∅ ∆ ∇ ∈ ∉ ∊ ∋ ∌ ∍ ∎ ∏ ∐ ∑ − ∓ ∔ ∕ ∖ ∗ ∘ ∙ √ ∛ ∜ ∝ ∞ ∟ ∠ ∡ ∢ ∣ ∤ ∥ ∦ ∧ ∨ ∩ ∪ ∫ ∬ ∭ ∮ ∯ ∰ ∱ ∲ ∳ ∴ ∵ ∶ ∷ ∸ ∹ ∺ ∻ ∼ ∽ ∾ ∿ ≀ ≁ ≂ ≃ ≄ ≅ ≆ ≇ ≈ ≉ ≊ ≋ ≌ ≍ ≎ ≏ ≐ ≑ ≒ ≓ ≔ ≕ ≖ ≗ ≘ ≙ ≚ ≛ ≜ ≝ ≞ ≟ ≠ ≡ ≢ ≣ ≤ ≥ ≦ ≧ ≨ ≩ ≪ ≫ ≬ ≭ ≮ ≯ ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ≺ ≻ ≼ ≽ ≾ ≿ ... 107 | Miscellaneous Technical 108 | ⌀ ⌁ ⌂ ⌃ ⌄ ⌅ ⌆ ⌇ ⌈ ⌉ ⌊ ⌋ ⌌ ⌍ ⌎ ⌏ ⌐ ⌑ ⌒ ⌓ ⌔ ⌕ ⌖ ⌗ ⌘ ⌙ ⌚ ⌛ ⌜ ⌝ ⌞ ⌟ ⌠ ⌡ ⌢ ⌣ ⌤ ⌥ ⌦ ⌧ ⌨ 〈 〉 ⌫ ⌬ ⌭ ⌮ ⌯ ⌰ ⌱ ⌲ ⌳ ⌴ ⌵ ⌶ ⌷ ⌸ ⌹ ⌺ ⌻ ⌼ ⌽ ⌾ ⌿ ⍀ ⍁ ⍂ ⍃ ⍄ ⍅ ⍆ ⍇ ⍈ ⍉ ⍊ ⍋ ⍌ ⍍ ⍎ ⍏ ⍐ ⍑ ⍒ ⍓ ⍔ ⍕ ⍖ ⍗ ⍘ ⍙ ⍚ ⍛ ⍜ ⍝ ⍞ ⍟ ⍠ ⍡ ⍢ ⍣ ⍤ ⍥ ⍦ ⍧ ⍨ ⍩ ⍪ ⍫ ⍬ ⍭ ⍮ ⍯ ⍰ ⍱ ⍲ ⍳ ⍴ ⍵ ⍶ ⍷ ⍸ ⍹ ⍺ ⍻ ⍼ ⍽ ⍾ ⍿ ... 109 | Control Pictures 110 | ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ ␠ ␡ ␢ ␣ ␤ ␥ ␦ 111 | Optical Character Recognition 112 | ⑀ ⑁ ⑂ ⑃ ⑄ ⑅ ⑆ ⑇ ⑈ ⑉ ⑊ 113 | Enclosed Alphanumerics 114 | ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ... 115 | Box Drawing 116 | ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏ ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿ 117 | Block Elements 118 | ▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▐ ░ ▒ ▓ ▔ ▕ ▖ ▗ ▘ ▙ ▚ ▛ ▜ ▝ ▞ ▟ 119 | Geometric Shapes 120 | ■ □ ▢ ▣ ▤ ▥ ▦ ▧ ▨ ▩ ▪ ▫ ▬ ▭ ▮ ▯ ▰ ▱ ▲ △ ▴ ▵ ▶ ▷ ▸ ▹ ► ▻ ▼ ▽ ▾ ▿ ◀ ◁ ◂ ◃ ◄ ◅ ◆ ◇ ◈ ◉ ◊ ○ ◌ ◍ ◎ ● ◐ ◑ ◒ ◓ ◔ ◕ ◖ ◗ ◘ ◙ ◚ ◛ ◜ ◝ ◞ ◟ ◠ ◡ ◢ ◣ ◤ ◥ ◦ ◧ ◨ ◩ ◪ ◫ ◬ ◭ ◮ ◯ ◰ ◱ ◲ ◳ ◴ ◵ ◶ ◷ ◸ ◹ ◺ ◻ ◼ ◽ ◾ ◿ 121 | Miscellaneous Symbols 122 | ☀ ☁ ☂ ☃ ☄ ★ ☆ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☎ ☏ ☐ ☑ ☒ ☓ ☖ ☗ ☙ ☚ ☛ ☜ ☝ ☞ ☟ ☠ ☡ ☢ ☣ ☤ ☥ ☦ ☧ ☨ ☩ ☪ ☫ ☬ ☭ ☮ ☯ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ ☸ ☹ ☺ ☻ ☼ ☽ ☾ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇ ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ♛ ♜ ♝ ♞ ♟ ♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧ ♨ ♩ ♪ ♫ ♬ ♭ ♮ ♯ ♰ ♱ ♲ ♳ ♴ ♵ ♶ ♷ ♸ ♹ ♺ ♻ ♼ ♽ ⚀ ⚁ ⚂ ⚃ ⚄ ... 123 | Dingbats 124 | ✁ ✂ ✃ ✄ ✆ ✇ ✈ ✉ ✌ ✍ ✎ ✏ ✐ ✑ ✒ ✓ ✔ ✕ ✖ ✗ ✘ ✙ ✚ ✛ ✜ ✝ ✞ ✟ ✠ ✡ ✢ ✣ ✤ ✥ ✦ ✧ ✩ ✪ ✫ ✬ ✭ ✮ ✯ ✰ ✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✿ ❀ ❁ ❂ ❃ ❄ ❅ ❆ ❇ ❈ ❉ ❊ ❋ ❍ ❏ ❐ ❑ ❒ ❖ ❘ ❙ ❚ ❛ ❜ ❝ ❞ ❡ ❢ ❣ ❤ ❥ ❦ ❧ ❨ ❩ ❪ ❫ ❬ ❭ ❮ ❯ ❰ ❱ ❲ ❳ ❴ ❵ ❶ ❷ ❸ ❹ ❺ ❻ ❼ ❽ ❾ ❿ ➀ ➁ ➂ ➃ ➄ ➅ ➆ ➇ ➈ ➉ ➊ ➋ ➌ ... 125 | Miscellaneous Mathematical Symbols-A 126 | ⟐ ⟑ ⟒ ⟓ ⟔ ⟕ ⟖ ⟗ ⟘ ⟙ ⟚ ⟛ ⟜ ⟝ ⟞ ⟟ ⟠ ⟡ ⟢ ⟣ ⟤ ⟥ ⟦ ⟧ ⟨ ⟩ ⟪ ⟫ 127 | Supplemental Arrows-A 128 | ⟰ ⟱ ⟲ ⟳ ⟴ ⟵ ⟶ ⟷ ⟸ ⟹ ⟺ ⟻ ⟼ ⟽ ⟾ ⟿ 129 | Braille Patterns 130 | ⠀ ⠁ ⠂ ⠃ ⠄ ⠅ ⠆ ⠇ ⠈ ⠉ ⠊ ⠋ ⠌ ⠍ ⠎ ⠏ ⠐ ⠑ ⠒ ⠓ ⠔ ⠕ ⠖ ⠗ ⠘ ⠙ ⠚ ⠛ ⠜ ⠝ ⠞ ⠟ ⠠ ⠡ ⠢ ⠣ ⠤ ⠥ ⠦ ⠧ ⠨ ⠩ ⠪ ⠫ ⠬ ⠭ ⠮ ⠯ ⠰ ⠱ ⠲ ⠳ ⠴ ⠵ ⠶ ⠷ ⠸ ⠹ ⠺ ⠻ ⠼ ⠽ ⠾ ⠿ ⡀ ⡁ ⡂ ⡃ ⡄ ⡅ ⡆ ⡇ ⡈ ⡉ ⡊ ⡋ ⡌ ⡍ ⡎ ⡏ ⡐ ⡑ ⡒ ⡓ ⡔ ⡕ ⡖ ⡗ ⡘ ⡙ ⡚ ⡛ ⡜ ⡝ ⡞ ⡟ ⡠ ⡡ ⡢ ⡣ ⡤ ⡥ ⡦ ⡧ ⡨ ⡩ ⡪ ⡫ ⡬ ⡭ ⡮ ⡯ ⡰ ⡱ ⡲ ⡳ ⡴ ⡵ ⡶ ⡷ ⡸ ⡹ ⡺ ⡻ ⡼ ⡽ ⡾ ⡿ ... 131 | Supplemental Arrows-B 132 | ⤀ ⤁ ⤂ ⤃ ⤄ ⤅ ⤆ ⤇ ⤈ ⤉ ⤊ ⤋ ⤌ ⤍ ⤎ ⤏ ⤐ ⤑ ⤒ ⤓ ⤔ ⤕ ⤖ ⤗ ⤘ ⤙ ⤚ ⤛ ⤜ ⤝ ⤞ ⤟ ⤠ ⤡ ⤢ ⤣ ⤤ ⤥ ⤦ ⤧ ⤨ ⤩ ⤪ ⤫ ⤬ ⤭ ⤮ ⤯ ⤰ ⤱ ⤲ ⤳ ⤴ ⤵ ⤶ ⤷ ⤸ ⤹ ⤺ ⤻ ⤼ ⤽ ⤾ ⤿ ⥀ ⥁ ⥂ ⥃ ⥄ ⥅ ⥆ ⥇ ⥈ ⥉ ⥊ ⥋ ⥌ ⥍ ⥎ ⥏ ⥐ ⥑ ⥒ ⥓ ⥔ ⥕ ⥖ ⥗ ⥘ ⥙ ⥚ ⥛ ⥜ ⥝ ⥞ ⥟ ⥠ ⥡ ⥢ ⥣ ⥤ ⥥ ⥦ ⥧ ⥨ ⥩ ⥪ ⥫ ⥬ ⥭ ⥮ ⥯ ⥰ ⥱ ⥲ ⥳ ⥴ ⥵ ⥶ ⥷ ⥸ ⥹ ⥺ ⥻ ⥼ ⥽ ⥾ ⥿ 133 | Miscellaneous Mathematical Symbols-B 134 | ⦀ ⦁ ⦂ ⦃ ⦄ ⦅ ⦆ ⦇ ⦈ ⦉ ⦊ ⦋ ⦌ ⦍ ⦎ ⦏ ⦐ ⦑ ⦒ ⦓ ⦔ ⦕ ⦖ ⦗ ⦘ ⦙ ⦚ ⦛ ⦜ ⦝ ⦞ ⦟ ⦠ ⦡ ⦢ ⦣ ⦤ ⦥ ⦦ ⦧ ⦨ ⦩ ⦪ ⦫ ⦬ ⦭ ⦮ ⦯ ⦰ ⦱ ⦲ ⦳ ⦴ ⦵ ⦶ ⦷ ⦸ ⦹ ⦺ ⦻ ⦼ ⦽ ⦾ ⦿ ⧀ ⧁ ⧂ ⧃ ⧄ ⧅ ⧆ ⧇ ⧈ ⧉ ⧊ ⧋ ⧌ ⧍ ⧎ ⧏ ⧐ ⧑ ⧒ ⧓ ⧔ ⧕ ⧖ ⧗ ⧘ ⧙ ⧚ ⧛ ⧜ ⧝ ⧞ ⧟ ⧠ ⧡ ⧢ ⧣ ⧤ ⧥ ⧦ ⧧ ⧨ ⧩ ⧪ ⧫ ⧬ ⧭ ⧮ ⧯ ⧰ ⧱ ⧲ ⧳ ⧴ ⧵ ⧶ ⧷ ⧸ ⧹ ⧺ ⧻ ⧼ ⧽ ⧾ ⧿ 135 | Supplemental Mathematical Operators 136 | ⨀ ⨁ ⨂ ⨃ ⨄ ⨅ ⨆ ⨇ ⨈ ⨉ ⨊ ⨋ ⨌ ⨍ ⨎ ⨏ ⨐ ⨑ ⨒ ⨓ ⨔ ⨕ ⨖ ⨗ ⨘ ⨙ ⨚ ⨛ ⨜ ⨝ ⨞ ⨟ ⨠ ⨡ ⨢ ⨣ ⨤ ⨥ ⨦ ⨧ ⨨ ⨩ ⨪ ⨫ ⨬ ⨭ ⨮ ⨯ ⨰ ⨱ ⨲ ⨳ ⨴ ⨵ ⨶ ⨷ ⨸ ⨹ ⨺ ⨻ ⨼ ⨽ ⨾ ⨿ ⩀ ⩁ ⩂ ⩃ ⩄ ⩅ ⩆ ⩇ ⩈ ⩉ ⩊ ⩋ ⩌ ⩍ ⩎ ⩏ ⩐ ⩑ ⩒ ⩓ ⩔ ⩕ ⩖ ⩗ ⩘ ⩙ ⩚ ⩛ ⩜ ⩝ ⩞ ⩟ ⩠ ⩡ ⩢ ⩣ ⩤ ⩥ ⩦ ⩧ ⩨ ⩩ ⩪ ⩫ ⩬ ⩭ ⩮ ⩯ ⩰ ⩱ ⩲ ⩳ ⩴ ⩵ ⩶ ⩷ ⩸ ⩹ ⩺ ⩻ ⩼ ⩽ ⩾ ⩿ ... 137 | CJK Radicals Supplement 138 | ⺀ ⺁ ⺂ ⺃ ⺄ ⺅ ⺆ ⺇ ⺈ ⺉ ⺊ ⺋ ⺌ ⺍ ⺎ ⺏ ⺐ ⺑ ⺒ ⺓ ⺔ ⺕ ⺖ ⺗ ⺘ ⺙ ⺛ ⺜ ⺝ ⺞ ⺟ ⺠ ⺡ ⺢ ⺣ ⺤ ⺥ ⺦ ⺧ ⺨ ⺩ ⺪ ⺫ ⺬ ⺭ ⺮ ⺯ ⺰ ⺱ ⺲ ⺳ ⺴ ⺵ ⺶ ⺷ ⺸ ⺹ ⺺ ⺻ ⺼ ⺽ ⺾ ⺿ ⻀ ⻁ ⻂ ⻃ ⻄ ⻅ ⻆ ⻇ ⻈ ⻉ ⻊ ⻋ ⻌ ⻍ ⻎ ⻏ ⻐ ⻑ ⻒ ⻓ ⻔ ⻕ ⻖ ⻗ ⻘ ⻙ ⻚ ⻛ ⻜ ⻝ ⻞ ⻟ ⻠ ⻡ ⻢ ⻣ ⻤ ⻥ ⻦ ⻧ ⻨ ⻩ ⻪ ⻫ ⻬ ⻭ ⻮ ⻯ ⻰ ⻱ ⻲ ⻳ 139 | Kangxi Radicals 140 | ⼀ ⼁ ⼂ ⼃ ⼄ ⼅ ⼆ ⼇ ⼈ ⼉ ⼊ ⼋ ⼌ ⼍ ⼎ ⼏ ⼐ ⼑ ⼒ ⼓ ⼔ ⼕ ⼖ ⼗ ⼘ ⼙ ⼚ ⼛ ⼜ ⼝ ⼞ ⼟ ⼠ ⼡ ⼢ ⼣ ⼤ ⼥ ⼦ ⼧ ⼨ ⼩ ⼪ ⼫ ⼬ ⼭ ⼮ ⼯ ⼰ ⼱ ⼲ ⼳ ⼴ ⼵ ⼶ ⼷ ⼸ ⼹ ⼺ ⼻ ⼼ ⼽ ⼾ ⼿ ⽀ ⽁ ⽂ ⽃ ⽄ ⽅ ⽆ ⽇ ⽈ ⽉ ⽊ ⽋ ⽌ ⽍ ⽎ ⽏ ⽐ ⽑ ⽒ ⽓ ⽔ ⽕ ⽖ ⽗ ⽘ ⽙ ⽚ ⽛ ⽜ ⽝ ⽞ ⽟ ⽠ ⽡ ⽢ ⽣ ⽤ ⽥ ⽦ ⽧ ⽨ ⽩ ⽪ ⽫ ⽬ ⽭ ⽮ ⽯ ⽰ ⽱ ⽲ ⽳ ⽴ ⽵ ⽶ ⽷ ⽸ ⽹ ⽺ ⽻ ⽼ ⽽ ⽾ ⽿ ... 141 | Ideographic Description Characters 142 | ⿰ ⿱ ⿲ ⿳ ⿴ ⿵ ⿶ ⿷ ⿸ ⿹ ⿺ ⿻ 143 | CJK Symbols and Punctuation 144 |   、 。 〃 〄 々 〆 〇 〈 〉 《 》 「 」 『 』 【 】 〒 〓 〔 〕 〖 〗 〘 〙 〚 〛 〜 〝 〞 〟 〠 〡 〢 〣 〤 〥 〦 〧 〨 〩 〪 〫 〬 〭 〮 〯 〰 〱 〲 〳 〴 〵 〶 〷 〸 〹 〺 〻 〼 〽 〾 〿 145 | Hiragana 146 | ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゕ ゖ ゙ ゚ ゛ ゜ ゝ ゞ ゟ 147 | Katakana 148 | ゠ ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ ヰ ヱ ヲ ン ヴ ヵ ヶ ヷ ヸ ヹ ヺ ・ ー ヽ ヾ ヿ 149 | Bopomofo 150 | ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ ㄪ ㄫ ㄬ 151 | Hangul Compatibility Jamo 152 | ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄸ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅃ ㅄ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ ㅤ ㅥ ㅦ ㅧ ㅨ ㅩ ㅪ ㅫ ㅬ ㅭ ㅮ ㅯ ㅰ ㅱ ㅲ ㅳ ㅴ ㅵ ㅶ ㅷ ㅸ ㅹ ㅺ ㅻ ㅼ ㅽ ㅾ ㅿ ㆀ ㆁ ㆂ ㆃ ㆄ ㆅ ㆆ ㆇ ㆈ ㆉ ㆊ ㆋ ㆌ ㆍ ㆎ 153 | Kanbun 154 | ㆐ ㆑ ㆒ ㆓ ㆔ ㆕ ㆖ ㆗ ㆘ ㆙ ㆚ ㆛ ㆜ ㆝ ㆞ ㆟ 155 | Bopomofo Extended 156 | ㆠ ㆡ ㆢ ㆣ ㆤ ㆥ ㆦ ㆧ ㆨ ㆩ ㆪ ㆫ ㆬ ㆭ ㆮ ㆯ ㆰ ㆱ ㆲ ㆳ ㆴ ㆵ ㆶ ㆷ 157 | Katakana Phonetic Extensions 158 | ㇰ ㇱ ㇲ ㇳ ㇴ ㇵ ㇶ ㇷ ㇸ ㇹ ㇺ ㇻ ㇼ ㇽ ㇾ ㇿ 159 | Enclosed CJK Letters and Months 160 | ㈀ ㈁ ㈂ ㈃ ㈄ ㈅ ㈆ ㈇ ㈈ ㈉ ㈊ ㈋ ㈌ ㈍ ㈎ ㈏ ㈐ ㈑ ㈒ ㈓ ㈔ ㈕ ㈖ ㈗ ㈘ ㈙ ㈚ ㈛ ㈜ ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ ㈪ ㈫ ㈬ ㈭ ㈮ ㈯ ㈰ ㈱ ㈲ ㈳ ㈴ ㈵ ㈶ ㈷ ㈸ ㈹ ㈺ ㈻ ㈼ ㈽ ㈾ ㈿ ㉀ ㉁ ㉂ ㉃ ㉑ ㉒ ㉓ ㉔ ㉕ ㉖ ㉗ ㉘ ㉙ ㉚ ㉛ ㉜ ㉝ ㉞ ㉟ ㉠ ㉡ ㉢ ㉣ ㉤ ㉥ ㉦ ㉧ ㉨ ㉩ ㉪ ㉫ ㉬ ㉭ ㉮ ㉯ ㉰ ㉱ ㉲ ㉳ ㉴ ㉵ ㉶ ㉷ ㉸ ㉹ ㉺ ㉻ ㉿ ㊀ ㊁ ㊂ ㊃ ㊄ ㊅ ㊆ ㊇ ㊈ ㊉ ㊊ ㊋ ㊌ ㊍ ㊎ ㊏ ㊐ ㊑ ㊒ ... 161 | CJK Compatibility 162 | ㌀ ㌁ ㌂ ㌃ ㌄ ㌅ ㌆ ㌇ ㌈ ㌉ ㌊ ㌋ ㌌ ㌍ ㌎ ㌏ ㌐ ㌑ ㌒ ㌓ ㌔ ㌕ ㌖ ㌗ ㌘ ㌙ ㌚ ㌛ ㌜ ㌝ ㌞ ㌟ ㌠ ㌡ ㌢ ㌣ ㌤ ㌥ ㌦ ㌧ ㌨ ㌩ ㌪ ㌫ ㌬ ㌭ ㌮ ㌯ ㌰ ㌱ ㌲ ㌳ ㌴ ㌵ ㌶ ㌷ ㌸ ㌹ ㌺ ㌻ ㌼ ㌽ ㌾ ㌿ ㍀ ㍁ ㍂ ㍃ ㍄ ㍅ ㍆ ㍇ ㍈ ㍉ ㍊ ㍋ ㍌ ㍍ ㍎ ㍏ ㍐ ㍑ ㍒ ㍓ ㍔ ㍕ ㍖ ㍗ ㍘ ㍙ ㍚ ㍛ ㍜ ㍝ ㍞ ㍟ ㍠ ㍡ ㍢ ㍣ ㍤ ㍥ ㍦ ㍧ ㍨ ㍩ ㍪ ㍫ ㍬ ㍭ ㍮ ㍯ ㍰ ㍱ ㍲ ㍳ ㍴ ㍵ ㍶ ㍻ ㍼ ㍽ ㍾ ㍿ ㎀ ㎁ ㎂ ㎃ ... 163 | CJK Unified Ideographs Extension A 164 | 㐀 㐁 㐂 㐃 㐄 㐅 㐆 㐇 㐈 㐉 㐊 㐋 㐌 㐍 㐎 㐏 㐐 㐑 㐒 㐓 㐔 㐕 㐖 㐗 㐘 㐙 㐚 㐛 㐜 㐝 㐞 㐟 㐠 㐡 㐢 㐣 㐤 㐥 㐦 㐧 㐨 㐩 㐪 㐫 㐬 㐭 㐮 㐯 㐰 㐱 㐲 㐳 㐴 㐵 㐶 㐷 㐸 㐹 㐺 㐻 㐼 㐽 㐾 㐿 㑀 㑁 㑂 㑃 㑄 㑅 㑆 㑇 㑈 㑉 㑊 㑋 㑌 㑍 㑎 㑏 㑐 㑑 㑒 㑓 㑔 㑕 㑖 㑗 㑘 㑙 㑚 㑛 㑜 㑝 㑞 㑟 㑠 㑡 㑢 㑣 㑤 㑥 㑦 㑧 㑨 㑩 㑪 㑫 㑬 㑭 㑮 㑯 㑰 㑱 㑲 㑳 㑴 㑵 㑶 㑷 㑸 㑹 㑺 㑻 㑼 㑽 㑾 㑿 ... 165 | CJK Unified Ideographs 166 | 一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 ... 167 | Yi Syllables 168 | ꀀ ꀁ ꀂ ꀃ ꀄ ꀅ ꀆ ꀇ ꀈ ꀉ ꀊ ꀋ ꀌ ꀍ ꀎ ꀏ ꀐ ꀑ ꀒ ꀓ ꀔ ꀕ ꀖ ꀗ ꀘ ꀙ ꀚ ꀛ ꀜ ꀝ ꀞ ꀟ ꀠ ꀡ ꀢ ꀣ ꀤ ꀥ ꀦ ꀧ ꀨ ꀩ ꀪ ꀫ ꀬ ꀭ ꀮ ꀯ ꀰ ꀱ ꀲ ꀳ ꀴ ꀵ ꀶ ꀷ ꀸ ꀹ ꀺ ꀻ ꀼ ꀽ ꀾ ꀿ ꁀ ꁁ ꁂ ꁃ ꁄ ꁅ ꁆ ꁇ ꁈ ꁉ ꁊ ꁋ ꁌ ꁍ ꁎ ꁏ ꁐ ꁑ ꁒ ꁓ ꁔ ꁕ ꁖ ꁗ ꁘ ꁙ ꁚ ꁛ ꁜ ꁝ ꁞ ꁟ ꁠ ꁡ ꁢ ꁣ ꁤ ꁥ ꁦ ꁧ ꁨ ꁩ ꁪ ꁫ ꁬ ꁭ ꁮ ꁯ ꁰ ꁱ ꁲ ꁳ ꁴ ꁵ ꁶ ꁷ ꁸ ꁹ ꁺ ꁻ ꁼ ꁽ ꁾ ꁿ ... 169 | Yi Radicals 170 | ꒐ ꒑ ꒒ ꒓ ꒔ ꒕ ꒖ ꒗ ꒘ ꒙ ꒚ ꒛ ꒜ ꒝ ꒞ ꒟ ꒠ ꒡ ꒢ ꒣ ꒤ ꒥ ꒦ ꒧ ꒨ ꒩ ꒪ ꒫ ꒬ ꒭ ꒮ ꒯ ꒰ ꒱ ꒲ ꒳ ꒴ ꒵ ꒶ ꒷ ꒸ ꒹ ꒺ ꒻ ꒼ ꒽ ꒾ ꒿ ꓀ ꓁ ꓂ ꓃ ꓄ ꓅ ꓆ 171 | Hangul Syllables 172 | 가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 ... 173 | Private Use Area 174 |                                                                                                                                 ... 175 | CJK Compatibility Ideographs 176 | 豈 更 車 賈 滑 串 句 龜 龜 契 金 喇 奈 懶 癩 羅 蘿 螺 裸 邏 樂 洛 烙 珞 落 酪 駱 亂 卵 欄 爛 蘭 鸞 嵐 濫 藍 襤 拉 臘 蠟 廊 朗 浪 狼 郎 來 冷 勞 擄 櫓 爐 盧 老 蘆 虜 路 露 魯 鷺 碌 祿 綠 菉 錄 鹿 論 壟 弄 籠 聾 牢 磊 賂 雷 壘 屢 樓 淚 漏 累 縷 陋 勒 肋 凜 凌 稜 綾 菱 陵 讀 拏 樂 諾 丹 寧 怒 率 異 北 磻 便 復 不 泌 數 索 參 塞 省 葉 說 殺 辰 沈 拾 若 掠 略 亮 兩 凉 梁 糧 良 諒 量 勵 ... 177 | Alphabetic Presentation Forms 178 | ff fi fl ffi ffl ſt st ﬓ ﬔ ﬕ ﬖ ﬗ יִ ﬞ ײַ ﬠ ﬡ ﬢ ﬣ ﬤ ﬥ ﬦ ﬧ ﬨ ﬩ שׁ שׂ שּׁ שּׂ אַ אָ אּ בּ גּ דּ הּ וּ זּ טּ יּ ךּ כּ לּ מּ נּ סּ ףּ פּ צּ קּ רּ שּ תּ וֹ בֿ כֿ פֿ ﭏ 179 | Arabic Presentation Forms-A 180 | ﭐ ﭑ ﭒ ﭓ ﭔ ﭕ ﭖ ﭗ ﭘ ﭙ ﭚ ﭛ ﭜ ﭝ ﭞ ﭟ ﭠ ﭡ ﭢ ﭣ ﭤ ﭥ ﭦ ﭧ ﭨ ﭩ ﭪ ﭫ ﭬ ﭭ ﭮ ﭯ ﭰ ﭱ ﭲ ﭳ ﭴ ﭵ ﭶ ﭷ ﭸ ﭹ ﭺ ﭻ ﭼ ﭽ ﭾ ﭿ ﮀ ﮁ ﮂ ﮃ ﮄ ﮅ ﮆ ﮇ ﮈ ﮉ ﮊ ﮋ ﮌ ﮍ ﮎ ﮏ ﮐ ﮑ ﮒ ﮓ ﮔ ﮕ ﮖ ﮗ ﮘ ﮙ ﮚ ﮛ ﮜ ﮝ ﮞ ﮟ ﮠ ﮡ ﮢ ﮣ ﮤ ﮥ ﮦ ﮧ ﮨ ﮩ ﮪ ﮫ ﮬ ﮭ ﮮ ﮯ ﮰ ﮱ ﯓ ﯔ ﯕ ﯖ ﯗ ﯘ ﯙ ﯚ ﯛ ﯜ ﯝ ﯞ ﯟ ﯠ ﯡ ﯢ ﯣ ﯤ ﯥ ﯦ ﯧ ﯨ ﯩ ﯪ ﯫ ﯬ ﯭ ﯮ ﯯ ﯰ ... 181 | Variation Selectors 182 | ︀ ︁ ︂ ︃ ︄ ︅ ︆ ︇ ︈ ︉ ︊ ︋ ︌ ︍ ︎ ️ 183 | Combining Half Marks 184 | ︠ ︡ ︢ ︣ 185 | CJK Compatibility Forms 186 | ︰ ︱ ︲ ︳ ︴ ︵ ︶ ︷ ︸ ︹ ︺ ︻ ︼ ︽ ︾ ︿ ﹀ ﹁ ﹂ ﹃ ﹄ ﹅ ﹆ ﹉ ﹊ ﹋ ﹌ ﹍ ﹎ ﹏ 187 | Small Form Variants 188 | ﹐ ﹑ ﹒ ﹔ ﹕ ﹖ ﹗ ﹘ ﹙ ﹚ ﹛ ﹜ ﹝ ﹞ ﹟ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫ 189 | Arabic Presentation Forms-B 190 | ﹰ ﹱ ﹲ ﹳ ﹴ ﹶ ﹷ ﹸ ﹹ ﹺ ﹻ ﹼ ﹽ ﹾ ﹿ ﺀ ﺁ ﺂ ﺃ ﺄ ﺅ ﺆ ﺇ ﺈ ﺉ ﺊ ﺋ ﺌ ﺍ ﺎ ﺏ ﺐ ﺑ ﺒ ﺓ ﺔ ﺕ ﺖ ﺗ ﺘ ﺙ ﺚ ﺛ ﺜ ﺝ ﺞ ﺟ ﺠ ﺡ ﺢ ﺣ ﺤ ﺥ ﺦ ﺧ ﺨ ﺩ ﺪ ﺫ ﺬ ﺭ ﺮ ﺯ ﺰ ﺱ ﺲ ﺳ ﺴ ﺵ ﺶ ﺷ ﺸ ﺹ ﺺ ﺻ ﺼ ﺽ ﺾ ﺿ ﻀ ﻁ ﻂ ﻃ ﻄ ﻅ ﻆ ﻇ ﻈ ﻉ ﻊ ﻋ ﻌ ﻍ ﻎ ﻏ ﻐ ﻑ ﻒ ﻓ ﻔ ﻕ ﻖ ﻗ ﻘ ﻙ ﻚ ﻛ ﻜ ﻝ ﻞ ﻟ ﻠ ﻡ ﻢ ﻣ ﻤ ﻥ ﻦ ﻧ ﻨ ﻩ ﻪ ﻫ ﻬ ﻭ ﻮ ﻯ ﻰ ... 191 | Halfwidth and Fullwidth Forms 192 | ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ⦅ ⦆ 。 「 」 、 ・ ヲ ァ ィ ゥ ェ ォ ャ ュ ョ ッ ー ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ ... 193 | Specials 194 |     � 195 | Old Italic 196 | 𐌀 𐌁 𐌂 𐌃 𐌄 𐌅 𐌆 𐌇 𐌈 𐌉 𐌊 𐌋 𐌌 𐌍 𐌎 𐌏 𐌐 𐌑 𐌒 𐌓 𐌔 𐌕 𐌖 𐌗 𐌘 𐌙 𐌚 𐌛 𐌜 𐌝 𐌞 𐌠 𐌡 𐌢 𐌣 197 | Gothic 198 | 𐌰 𐌱 𐌲 𐌳 𐌴 𐌵 𐌶 𐌷 𐌸 𐌹 𐌺 𐌻 𐌼 𐌽 𐌾 𐌿 𐍀 𐍁 𐍂 𐍃 𐍄 𐍅 𐍆 𐍇 𐍈 𐍉 𐍊 199 | Deseret 200 | 𐐀 𐐁 𐐂 𐐃 𐐄 𐐅 𐐆 𐐇 𐐈 𐐉 𐐊 𐐋 𐐌 𐐍 𐐎 𐐏 𐐐 𐐑 𐐒 𐐓 𐐔 𐐕 𐐖 𐐗 𐐘 𐐙 𐐚 𐐛 𐐜 𐐝 𐐞 𐐟 𐐠 𐐡 𐐢 𐐣 𐐤 𐐥 𐐨 𐐩 𐐪 𐐫 𐐬 𐐭 𐐮 𐐯 𐐰 𐐱 𐐲 𐐳 𐐴 𐐵 𐐶 𐐷 𐐸 𐐹 𐐺 𐐻 𐐼 𐐽 𐐾 𐐿 𐑀 𐑁 𐑂 𐑃 𐑄 𐑅 𐑆 𐑇 𐑈 𐑉 𐑊 𐑋 𐑌 𐑍 201 | Byzantine Musical Symbols 202 | 𝀀 𝀁 𝀂 𝀃 𝀄 𝀅 𝀆 𝀇 𝀈 𝀉 𝀊 𝀋 𝀌 𝀍 𝀎 𝀏 𝀐 𝀑 𝀒 𝀓 𝀔 𝀕 𝀖 𝀗 𝀘 𝀙 𝀚 𝀛 𝀜 𝀝 𝀞 𝀟 𝀠 𝀡 𝀢 𝀣 𝀤 𝀥 𝀦 𝀧 𝀨 𝀩 𝀪 𝀫 𝀬 𝀭 𝀮 𝀯 𝀰 𝀱 𝀲 𝀳 𝀴 𝀵 𝀶 𝀷 𝀸 𝀹 𝀺 𝀻 𝀼 𝀽 𝀾 𝀿 𝁀 𝁁 𝁂 𝁃 𝁄 𝁅 𝁆 𝁇 𝁈 𝁉 𝁊 𝁋 𝁌 𝁍 𝁎 𝁏 𝁐 𝁑 𝁒 𝁓 𝁔 𝁕 𝁖 𝁗 𝁘 𝁙 𝁚 𝁛 𝁜 𝁝 𝁞 𝁟 𝁠 𝁡 𝁢 𝁣 𝁤 𝁥 𝁦 𝁧 𝁨 𝁩 𝁪 𝁫 𝁬 𝁭 𝁮 𝁯 𝁰 𝁱 𝁲 𝁳 𝁴 𝁵 𝁶 𝁷 𝁸 𝁹 𝁺 𝁻 𝁼 𝁽 𝁾 𝁿 ... 203 | Musical Symbols 204 | 𝄀 𝄁 𝄂 𝄃 𝄄 𝄅 𝄆 𝄇 𝄈 𝄉 𝄊 𝄋 𝄌 𝄍 𝄎 𝄏 𝄐 𝄑 𝄒 𝄓 𝄔 𝄕 𝄖 𝄗 𝄘 𝄙 𝄚 𝄛 𝄜 𝄝 𝄞 𝄟 𝄠 𝄡 𝄢 𝄣 𝄤 𝄥 𝄦 𝄪 𝄫 𝄬 𝄭 𝄮 𝄯 𝄰 𝄱 𝄲 𝄳 𝄴 𝄵 𝄶 𝄷 𝄸 𝄹 𝄺 𝄻 𝄼 𝄽 𝄾 𝄿 𝅀 𝅁 𝅂 𝅃 𝅄 𝅅 𝅆 𝅇 𝅈 𝅉 𝅊 𝅋 𝅌 𝅍 𝅎 𝅏 𝅐 𝅑 𝅒 𝅓 𝅔 𝅕 𝅖 𝅗 𝅘 𝅙 𝅚 𝅛 𝅜 𝅝 𝅗𝅥 𝅘𝅥 𝅘𝅥𝅮 𝅘𝅥𝅯 𝅘𝅥𝅰 𝅘𝅥𝅱 𝅘𝅥𝅲 𝅥 𝅦 𝅧 𝅨 𝅩 𝅪 𝅫 𝅬 𝅭 𝅮 𝅯 𝅰 𝅱 𝅲 𝅳 𝅴 𝅵 𝅶 𝅷 𝅸 𝅹 𝅺 𝅻 𝅼 𝅽 𝅾 𝅿 𝆀 𝆁 𝆂 ... 205 | Mathematical Alphanumeric Symbols 206 | 𝐀 𝐁 𝐂 𝐃 𝐄 𝐅 𝐆 𝐇 𝐈 𝐉 𝐊 𝐋 𝐌 𝐍 𝐎 𝐏 𝐐 𝐑 𝐒 𝐓 𝐔 𝐕 𝐖 𝐗 𝐘 𝐙 𝐚 𝐛 𝐜 𝐝 𝐞 𝐟 𝐠 𝐡 𝐢 𝐣 𝐤 𝐥 𝐦 𝐧 𝐨 𝐩 𝐪 𝐫 𝐬 𝐭 𝐮 𝐯 𝐰 𝐱 𝐲 𝐳 𝐴 𝐵 𝐶 𝐷 𝐸 𝐹 𝐺 𝐻 𝐼 𝐽 𝐾 𝐿 𝑀 𝑁 𝑂 𝑃 𝑄 𝑅 𝑆 𝑇 𝑈 𝑉 𝑊 𝑋 𝑌 𝑍 𝑎 𝑏 𝑐 𝑑 𝑒 𝑓 𝑔 𝑖 𝑗 𝑘 𝑙 𝑚 𝑛 𝑜 𝑝 𝑞 𝑟 𝑠 𝑡 𝑢 𝑣 𝑤 𝑥 𝑦 𝑧 𝑨 𝑩 𝑪 𝑫 𝑬 𝑭 𝑮 𝑯 𝑰 𝑱 𝑲 𝑳 𝑴 𝑵 𝑶 𝑷 𝑸 𝑹 𝑺 𝑻 𝑼 𝑽 𝑾 𝑿 𝒀 ... 207 | CJK Unified Ideographs Extension B 208 | 𠀀 𠀁 𠀂 𠀃 𠀄 𠀅 𠀆 𠀇 𠀈 𠀉 𠀊 𠀋 𠀌 𠀍 𠀎 𠀏 𠀐 𠀑 𠀒 𠀓 𠀔 𠀕 𠀖 𠀗 𠀘 𠀙 𠀚 𠀛 𠀜 𠀝 𠀞 𠀟 𠀠 𠀡 𠀢 𠀣 𠀤 𠀥 𠀦 𠀧 𠀨 𠀩 𠀪 𠀫 𠀬 𠀭 𠀮 𠀯 𠀰 𠀱 𠀲 𠀳 𠀴 𠀵 𠀶 𠀷 𠀸 𠀹 𠀺 𠀻 𠀼 𠀽 𠀾 𠀿 𠁀 𠁁 𠁂 𠁃 𠁄 𠁅 𠁆 𠁇 𠁈 𠁉 𠁊 𠁋 𠁌 𠁍 𠁎 𠁏 𠁐 𠁑 𠁒 𠁓 𠁔 𠁕 𠁖 𠁗 𠁘 𠁙 𠁚 𠁛 𠁜 𠁝 𠁞 𠁟 𠁠 𠁡 𠁢 𠁣 𠁤 𠁥 𠁦 𠁧 𠁨 𠁩 𠁪 𠁫 𠁬 𠁭 𠁮 𠁯 𠁰 𠁱 𠁲 𠁳 𠁴 𠁵 𠁶 𠁷 𠁸 𠁹 𠁺 𠁻 𠁼 𠁽 𠁾 𠁿 ... 209 | CJK Compatibility Ideographs Supplement 210 | 丽 丸 乁 𠄢 你 侮 侻 倂 偺 備 僧 像 㒞 𠘺 免 兔 兤 具 𠔜 㒹 內 再 𠕋 冗 冤 仌 冬 况 𩇟 凵 刃 㓟 刻 剆 割 剷 㔕 勇 勉 勤 勺 包 匆 北 卉 卑 博 即 卽 卿 卿 卿 𠨬 灰 及 叟 𠭣 叫 叱 吆 咞 吸 呈 周 咢 哶 唐 啓 啣 善 善 喙 喫 喳 嗂 圖 嘆 圗 噑 噴 切 壮 城 埴 堍 型 堲 報 墬 𡓤 売 壷 夆 多 夢 奢 𡚨 𡛪 姬 娛 娧 姘 婦 㛮 㛼 嬈 嬾 嬾 𡧈 寃 寘 寧 寳 𡬘 寿 将 当 尢 㞁 屠 屮 峀 岍 𡷤 嵃 𡷦 嵮 嵫 ... 211 | Tags 212 | 󠀁 󠀠 󠀡 󠀢 󠀣 󠀤 󠀥 󠀦 󠀧 󠀨 󠀩 󠀪 󠀫 󠀬 󠀭 󠀮 󠀯 󠀰 󠀱 󠀲 󠀳 󠀴 󠀵 󠀶 󠀷 󠀸 󠀹 󠀺 󠀻 󠀼 󠀽 󠀾 󠀿 󠁀 󠁁 󠁂 󠁃 󠁄 󠁅 󠁆 󠁇 󠁈 󠁉 󠁊 󠁋 󠁌 󠁍 󠁎 󠁏 󠁐 󠁑 󠁒 󠁓 󠁔 󠁕 󠁖 󠁗 󠁘 󠁙 󠁚 󠁛 󠁜 󠁝 󠁞 󠁟 󠁠 󠁡 󠁢 󠁣 󠁤 󠁥 󠁦 󠁧 󠁨 󠁩 󠁪 󠁫 󠁬 󠁭 󠁮 󠁯 󠁰 󠁱 󠁲 󠁳 󠁴 󠁵 󠁶 󠁷 󠁸 󠁹 󠁺 󠁻 󠁼 󠁽 󠁾 󠁿 213 | Supplementary Private Use Area-A 214 | 󰀀 󰀁 󰀂 󰀃 󰀄 󰀅 󰀆 󰀇 󰀈 󰀉 󰀊 󰀋 󰀌 󰀍 󰀎 󰀏 󰀐 󰀑 󰀒 󰀓 󰀔 󰀕 󰀖 󰀗 󰀘 󰀙 󰀚 󰀛 󰀜 󰀝 󰀞 󰀟 󰀠 󰀡 󰀢 󰀣 󰀤 󰀥 󰀦 󰀧 󰀨 󰀩 󰀪 󰀫 󰀬 󰀭 󰀮 󰀯 󰀰 󰀱 󰀲 󰀳 󰀴 󰀵 󰀶 󰀷 󰀸 󰀹 󰀺 󰀻 󰀼 󰀽 󰀾 󰀿 󰁀 󰁁 󰁂 󰁃 󰁄 󰁅 󰁆 󰁇 󰁈 󰁉 󰁊 󰁋 󰁌 󰁍 󰁎 󰁏 󰁐 󰁑 󰁒 󰁓 󰁔 󰁕 󰁖 󰁗 󰁘 󰁙 󰁚 󰁛 󰁜 󰁝 󰁞 󰁟 󰁠 󰁡 󰁢 󰁣 󰁤 󰁥 󰁦 󰁧 󰁨 󰁩 󰁪 󰁫 󰁬 󰁭 󰁮 󰁯 󰁰 󰁱 󰁲 󰁳 󰁴 󰁵 󰁶 󰁷 󰁸 󰁹 󰁺 󰁻 󰁼 󰁽 󰁾 󰁿 ... 215 | Supplementary Private Use Area-B 216 | 􀀀 􀀁 􀀂 􀀃 􀀄 􀀅 􀀆 􀀇 􀀈 􀀉 􀀊 􀀋 􀀌 􀀍 􀀎 􀀏 􀀐 􀀑 􀀒 􀀓 􀀔 􀀕 􀀖 􀀗 􀀘 􀀙 􀀚 􀀛 􀀜 􀀝 􀀞 􀀟 􀀠 􀀡 􀀢 􀀣 􀀤 􀀥 􀀦 􀀧 􀀨 􀀩 􀀪 􀀫 􀀬 􀀭 􀀮 􀀯 􀀰 􀀱 􀀲 􀀳 􀀴 􀀵 􀀶 􀀷 􀀸 􀀹 􀀺 􀀻 􀀼 􀀽 􀀾 􀀿 􀁀 􀁁 􀁂 􀁃 􀁄 􀁅 􀁆 􀁇 􀁈 􀁉 􀁊 􀁋 􀁌 􀁍 􀁎 􀁏 􀁐 􀁑 􀁒 􀁓 􀁔 􀁕 􀁖 􀁗 􀁘 􀁙 􀁚 􀁛 􀁜 􀁝 􀁞 􀁟 􀁠 􀁡 􀁢 􀁣 􀁤 􀁥 􀁦 􀁧 􀁨 􀁩 􀁪 􀁫 􀁬 􀁭 􀁮 􀁯 􀁰 􀁱 􀁲 􀁳 􀁴 􀁵 􀁶 􀁷 􀁸 􀁹 􀁺 􀁻 􀁼 􀁽 􀁾 􀁿 ... 217 | -------------------------------------------------------------------------------- /benchmark/data/Devanagari.txt: -------------------------------------------------------------------------------- 1 | मधुशाला 2 | मृदु भावों के अंगूरों की आज बना लाया हाला, 3 | प्रियतम, अपने ही हाथों से आज पिलाऊँगा प्याला, 4 | पहले भोग लगा लूँ तेरा फिर प्रसाद जग पाएगा, 5 | सबसे पहले तेरा स्वागत करती मेरी मधुशाला।।१। 6 | 7 | प्यास तुझे तो, विश्व तपाकर पूर्ण निकालूँगा हाला, 8 | एक पाँव से साकी बनकर नाचूँगा लेकर प्याला, 9 | जीवन की मधुता तो तेरे ऊपर कब का वार चुका, 10 | आज निछावर कर दूँगा मैं तुझ पर जग की मधुशाला।।२। 11 | 12 | प्रियतम, तू मेरी हाला है, मैं तेरा प्यासा प्याला, 13 | अपने को मुझमें भरकर तू बनता है पीनेवाला, 14 | मैं तुझको छक छलका करता, मस्त मुझे पी तू होता, 15 | एक दूसरे की हम दोनों आज परस्पर मधुशाला।।३। 16 | 17 | भावुकता अंगूर लता से खींच कल्पना की हाला, 18 | कवि साकी बनकर आया है भरकर कविता का प्याला, 19 | कभी न कण-भर खाली होगा लाख पिएँ, दो लाख पिएँ! 20 | पाठकगण हैं पीनेवाले, पुस्तक मेरी मधुशाला।।४। 21 | 22 | मधुर भावनाओं की सुमधुर नित्य बनाता हूँ हाला, 23 | भरता हूँ इस मधु से अपने अंतर का प्यासा प्याला, 24 | उठा कल्पना के हाथों से स्वयं उसे पी जाता हूँ, 25 | अपने ही में हूँ मैं साकी, पीनेवाला, मधुशाला।।५। 26 | 27 | मदिरालय जाने को घर से चलता है पीनेवला, 28 | 'किस पथ से जाऊँ?' असमंजस में है वह भोलाभाला, 29 | अलग-अलग पथ बतलाते सब पर मैं यह बतलाता हूँ - 30 | 'राह पकड़ तू एक चला चल, पा जाएगा मधुशाला।'। ६। 31 | 32 | चलने ही चलने में कितना जीवन, हाय, बिता डाला! 33 | 'दूर अभी है', पर, कहता है हर पथ बतलानेवाला, 34 | हिम्मत है न बढूँ आगे को साहस है न फिरुँ पीछे, 35 | किंकर्तव्यविमूढ़ मुझे कर दूर खड़ी है मधुशाला।।७। 36 | 37 | मुख से तू अविरत कहता जा मधु, मदिरा, मादक हाला, 38 | हाथों में अनुभव करता जा एक ललित कल्पित प्याला, 39 | ध्यान किए जा मन में सुमधुर सुखकर, सुंदर साकी का, 40 | और बढ़ा चल, पथिक, न तुझको दूर लगेगी मधुशाला।।८। 41 | 42 | मदिरा पीने की अभिलाषा ही बन जाए जब हाला, 43 | अधरों की आतुरता में ही जब आभासित हो प्याला, 44 | बने ध्यान ही करते-करते जब साकी साकार, सखे, 45 | रहे न हाला, प्याला, साकी, तुझे मिलेगी मधुशाला।।९। 46 | 47 | सुन, कलकल़ , छलछल़ मधुघट से गिरती प्यालों में हाला, 48 | सुन, रूनझुन रूनझुन चल वितरण करती मधु साकीबाला, 49 | बस आ पहुंचे, दुर नहीं कुछ, चार कदम अब चलना है, 50 | चहक रहे, सुन, पीनेवाले, महक रही, ले, मधुशाला।।१०। 51 | 52 | जलतरंग बजता, जब चुंबन करता प्याले को प्याला, 53 | वीणा झंकृत होती, चलती जब रूनझुन साकीबाला, 54 | डाँट डपट मधुविक्रेता की ध्वनित पखावज करती है, 55 | मधुरव से मधु की मादकता और बढ़ाती मधुशाला।।११। 56 | 57 | मेंहदी रंजित मृदुल हथेली पर माणिक मधु का प्याला, 58 | अंगूरी अवगुंठन डाले स्वर्ण वर्ण साकीबाला, 59 | पाग बैंजनी, जामा नीला डाट डटे पीनेवाले, 60 | इन्द्रधनुष से होड़ लगाती आज रंगीली मधुशाला।।१२। 61 | 62 | हाथों में आने से पहले नाज़ दिखाएगा प्याला, 63 | अधरों पर आने से पहले अदा दिखाएगी हाला, 64 | बहुतेरे इनकार करेगा साकी आने से पहले, 65 | पथिक, न घबरा जाना, पहले मान करेगी मधुशाला।।१३। 66 | 67 | लाल सुरा की धार लपट सी कह न इसे देना ज्वाला, 68 | फेनिल मदिरा है, मत इसको कह देना उर का छाला, 69 | दर्द नशा है इस मदिरा का विगत स्मृतियाँ साकी हैं, 70 | पीड़ा में आनंद जिसे हो, आए मेरी मधुशाला।।१४। 71 | 72 | जगती की शीतल हाला सी पथिक, नहीं मेरी हाला, 73 | जगती के ठंडे प्याले सा पथिक, नहीं मेरा प्याला, 74 | ज्वाल सुरा जलते प्याले में दग्ध हृदय की कविता है, 75 | जलने से भयभीत न जो हो, आए मेरी मधुशाला।।१५। 76 | 77 | बहती हाला देखी, देखो लपट उठाती अब हाला, 78 | देखो प्याला अब छूते ही होंठ जला देनेवाला, 79 | 'होंठ नहीं, सब देह दहे, पर पीने को दो बूंद मिले' 80 | ऐसे मधु के दीवानों को आज बुलाती मधुशाला।।१६। 81 | 82 | धर्मग्रन्थ सब जला चुकी है, जिसके अंतर की ज्वाला, 83 | मंदिर, मसजिद, गिरिजे, सब को तोड़ चुका जो मतवाला, 84 | पंडित, मोमिन, पादिरयों के फंदों को जो काट चुका, 85 | कर सकती है आज उसी का स्वागत मेरी मधुशाला।।१७। 86 | 87 | लालायित अधरों से जिसने, हाय, नहीं चूमी हाला, 88 | हर्ष-विकंपित कर से जिसने, हा, न छुआ मधु का प्याला, 89 | हाथ पकड़ लज्जित साकी को पास नहीं जिसने खींचा, 90 | व्यर्थ सुखा डाली जीवन की उसने मधुमय मधुशाला।।१८। 91 | 92 | बने पुजारी प्रेमी साकी, गंगाजल पावन हाला, 93 | रहे फेरता अविरत गति से मधु के प्यालों की माला' 94 | 'और लिये जा, और पीये जा', इसी मंत्र का जाप करे' 95 | मैं शिव की प्रतिमा बन बैठूं, मंदिर हो यह मधुशाला।।१९। 96 | 97 | बजी न मंदिर में घड़ियाली, चढ़ी न प्रतिमा पर माला, 98 | बैठा अपने भवन मुअज्ज़िन देकर मस्जिद में ताला, 99 | लुटे ख़जाने नरपितयों के गिरीं गढ़ों की दीवारें, 100 | रहें मुबारक पीनेवाले, खुली रहे यह मधुशाला।।२०। 101 | 102 | बड़े बड़े परिवार मिटें यों, एक न हो रोनेवाला, 103 | हो जाएँ सुनसान महल वे, जहाँ थिरकतीं सुरबाला, 104 | राज्य उलट जाएँ, भूपों की भाग्य सुलक्ष्मी सो जाए, 105 | जमे रहेंगे पीनेवाले, जगा करेगी मधुशाला।।२१। 106 | 107 | सब मिट जाएँ, बना रहेगा सुन्दर साकी, यम काला, 108 | सूखें सब रस, बने रहेंगे, किन्तु, हलाहल औ' हाला, 109 | धूमधाम औ' चहल पहल के स्थान सभी सुनसान बनें, 110 | जगा करेगा अविरत मरघट, जगा करेगी मधुशाला।।२२। 111 | 112 | भुरा सदा कहलायेगा जग में बाँका, मदचंचल प्याला, 113 | छैल छबीला, रसिया साकी, अलबेला पीनेवाला, 114 | पटे कहाँ से, मधु औ' जग की जोड़ी ठीक नहीं, 115 | जग जर्जर प्रतिदन, प्रतिक्षण, पर नित्य नवेली मधुशाला।।२३। 116 | 117 | बिना पिये जो मधुशाला को बुरा कहे, वह मतवाला, 118 | पी लेने पर तो उसके मुह पर पड़ जाएगा ताला, 119 | दास द्रोहियों दोनों में है जीत सुरा की, प्याले की, 120 | विश्वविजयिनी बनकर जग में आई मेरी मधुशाला।।२४। 121 | 122 | हरा भरा रहता मदिरालय, जग पर पड़ जाए पाला, 123 | वहाँ मुहर्रम का तम छाए, यहाँ होलिका की ज्वाला, 124 | स्वर्ग लोक से सीधी उतरी वसुधा पर, दुख क्या जाने, 125 | पढ़े मर्सिया दुनिया सारी, ईद मनाती मधुशाला।।२५। 126 | 127 | एक बरस में, एक बार ही जगती होली की ज्वाला, 128 | एक बार ही लगती बाज़ी, जलती दीपों की माला, 129 | दुनियावालों, किन्तु, किसी दिन आ मदिरालय में देखो, 130 | दिन को होली, रात दिवाली, रोज़ मनाती मधुशाला।।२६। 131 | 132 | नहीं जानता कौन, मनुज आया बनकर पीनेवाला, 133 | कौन अपिरिचत उस साकी से, जिसने दूध पिला पाला, 134 | जीवन पाकर मानव पीकर मस्त रहे, इस कारण ही, 135 | जग में आकर सबसे पहले पाई उसने मधुशाला।।२७। 136 | 137 | बनी रहें अंगूर लताएँ जिनसे मिलती है हाला, 138 | बनी रहे वह मिटटी जिससे बनता है मधु का प्याला, 139 | बनी रहे वह मदिर पिपासा तृप्त न जो होना जाने, 140 | बनें रहें ये पीने वाले, बनी रहे यह मधुशाला।।२८। 141 | 142 | सकुशल समझो मुझको, सकुशल रहती यदि साकीबाला, 143 | मंगल और अमंगल समझे मस्ती में क्या मतवाला, 144 | मित्रों, मेरी क्षेम न पूछो आकर, पर मधुशाला की, 145 | कहा करो 'जय राम' न मिलकर, कहा करो 'जय मधुशाला'।।२९। 146 | 147 | सूर्य बने मधु का विक्रेता, सिंधु बने घट, जल, हाला, 148 | बादल बन-बन आए साकी, भूमि बने मधु का प्याला, 149 | झड़ी लगाकर बरसे मदिरा रिमझिम, रिमझिम, रिमझिम कर, 150 | बेलि, विटप, तृण बन मैं पीऊँ, वर्षा ऋतु हो मधुशाला।।३०। 151 | 152 | तारक मणियों से सज्जित नभ बन जाए मधु का प्याला, 153 | सीधा करके भर दी जाए उसमें सागरजल हाला, 154 | मत्त समीरण साकी बनकर अधरों पर छलका जाए, 155 | फैले हों जो सागर तट से विश्व बने यह मधुशाला।।३१। 156 | 157 | अधरों पर हो कोई भी रस जिहवा पर लगती हाला, 158 | भाजन हो कोई हाथों में लगता रक्खा है प्याला, 159 | हर सूरत साकी की सूरत में परिवर्तित हो जाती, 160 | आँखों के आगे हो कुछ भी, आँखों में है मधुशाला।।३२। 161 | 162 | पौधे आज बने हैं साकी ले ले फूलों का प्याला, 163 | भरी हुई है जिसके अंदर पिरमल-मधु-सुरिभत हाला, 164 | माँग माँगकर भ्रमरों के दल रस की मदिरा पीते हैं, 165 | झूम झपक मद-झंपित होते, उपवन क्या है मधुशाला!।३३। 166 | 167 | प्रति रसाल तरू साकी सा है, प्रति मंजरिका है प्याला, 168 | छलक रही है जिसके बाहर मादक सौरभ की हाला, 169 | छक जिसको मतवाली कोयल कूक रही डाली डाली 170 | हर मधुऋतु में अमराई में जग उठती है मधुशाला।।३४। 171 | 172 | मंद झकोरों के प्यालों में मधुऋतु सौरभ की हाला 173 | भर भरकर है अनिल पिलाता बनकर मधु-मद-मतवाला, 174 | हरे हरे नव पल्लव, तरूगण, नूतन डालें, वल्लरियाँ, 175 | छक छक, झुक झुक झूम रही हैं, मधुबन में है मधुशाला।।३५। 176 | 177 | साकी बन आती है प्रातः जब अरुणा ऊषा बाला, 178 | तारक-मणि-मंडित चादर दे मोल धरा लेती हाला, 179 | अगणित कर-किरणों से जिसको पी, खग पागल हो गाते, 180 | प्रति प्रभात में पूर्ण प्रकृति में मुखिरत होती मधुशाला।।३६। 181 | 182 | उतर नशा जब उसका जाता, आती है संध्या बाला, 183 | बड़ी पुरानी, बड़ी नशीली नित्य ढला जाती हाला, 184 | जीवन के संताप शोक सब इसको पीकर मिट जाते 185 | सुरा-सुप्त होते मद-लोभी जागृत रहती मधुशाला।।३७। 186 | 187 | अंधकार है मधुविक्रेता, सुन्दर साकी शशिबाला 188 | किरण किरण में जो छलकाती जाम जुम्हाई का हाला, 189 | पीकर जिसको चेतनता खो लेने लगते हैं झपकी 190 | तारकदल से पीनेवाले, रात नहीं है, मधुशाला।।३८। 191 | 192 | किसी ओर मैं आँखें फेरूँ, दिखलाई देती हाला 193 | किसी ओर मैं आँखें फेरूँ, दिखलाई देता प्याला, 194 | किसी ओर मैं देखूं, मुझको दिखलाई देता साकी 195 | किसी ओर देखूं, दिखलाई पड़ती मुझको मधुशाला।।३९। 196 | 197 | साकी बन मुरली आई साथ लिए कर में प्याला, 198 | जिनमें वह छलकाती लाई अधर-सुधा-रस की हाला, 199 | योगिराज कर संगत उसकी नटवर नागर कहलाए, 200 | देखो कैसों-कैसों को है नाच नचाती मधुशाला।।४०। 201 | 202 | वादक बन मधु का विक्रेता लाया सुर-सुमधुर-हाला, 203 | रागिनियाँ बन साकी आई भरकर तारों का प्याला, 204 | विक्रेता के संकेतों पर दौड़ लयों, आलापों में, 205 | पान कराती श्रोतागण को, झंकृत वीणा मधुशाला।।४१। 206 | 207 | चित्रकार बन साकी आता लेकर तूली का प्याला, 208 | जिसमें भरकर पान कराता वह बहु रस-रंगी हाला, 209 | मन के चित्र जिसे पी-पीकर रंग-बिरंगे हो जाते, 210 | चित्रपटी पर नाच रही है एक मनोहर मधुशाला।।४२। 211 | 212 | घन श्यामल अंगूर लता से खिंच खिंच यह आती हाला, 213 | अरूण-कमल-कोमल कलियों की प्याली, फूलों का प्याला, 214 | लोल हिलोरें साकी बन बन माणिक मधु से भर जातीं, 215 | हंस मत्त होते पी पीकर मानसरोवर मधुशाला।।४३। 216 | 217 | हिम श्रेणी अंगूर लता-सी फैली, हिम जल है हाला, 218 | चंचल नदियाँ साकी बनकर, भरकर लहरों का प्याला, 219 | कोमल कूर-करों में अपने छलकाती निशिदिन चलतीं, 220 | पीकर खेत खड़े लहराते, भारत पावन मधुशाला।।४४। 221 | 222 | धीर सुतों के हृदय रक्त की आज बना रक्तिम हाला, 223 | वीर सुतों के वर शीशों का हाथों में लेकर प्याला, 224 | अति उदार दानी साकी है आज बनी भारतमाता, 225 | स्वतंत्रता है तृषित कालिका बलिवेदी है मधुशाला।।४५। 226 | 227 | दुतकारा मस्जिद ने मुझको कहकर है पीनेवाला, 228 | ठुकराया ठाकुरद्वारे ने देख हथेली पर प्याला, 229 | कहाँ ठिकाना मिलता जग में भला अभागे काफिर को? 230 | शरणस्थल बनकर न मुझे यदि अपना लेती मधुशाला।।४६। 231 | 232 | पथिक बना मैं घूम रहा हूँ, सभी जगह मिलती हाला, 233 | सभी जगह मिल जाता साकी, सभी जगह मिलता प्याला, 234 | मुझे ठहरने का, हे मित्रों, कष्ट नहीं कुछ भी होता, 235 | मिले न मंदिर, मिले न मस्जिद, मिल जाती है मधुशाला।।४७। 236 | 237 | सजें न मस्जिद और नमाज़ी कहता है अल्लाताला, 238 | सजधजकर, पर, साकी आता, बन ठनकर, पीनेवाला, 239 | शेख, कहाँ तुलना हो सकती मस्जिद की मदिरालय से 240 | चिर विधवा है मस्जिद तेरी, सदा सुहागिन मधुशाला।।४८। 241 | 242 | बजी नफ़ीरी और नमाज़ी भूल गया अल्लाताला, 243 | गाज गिरी, पर ध्यान सुरा में मग्न रहा पीनेवाला, 244 | शेख, बुरा मत मानो इसको, साफ़ कहूँ तो मस्जिद को 245 | अभी युगों तक सिखलाएगी ध्यान लगाना मधुशाला!।४९। 246 | 247 | मुसलमान औ' हिन्दू है दो, एक, मगर, उनका प्याला, 248 | एक, मगर, उनका मदिरालय, एक, मगर, उनकी हाला, 249 | दोनों रहते एक न जब तक मस्जिद मन्दिर में जाते, 250 | बैर बढ़ाते मस्जिद मन्दिर मेल कराती मधुशाला!।५०। 251 | 252 | कोई भी हो शेख नमाज़ी या पंडित जपता माला, 253 | बैर भाव चाहे जितना हो मदिरा से रखनेवाला, 254 | एक बार बस मधुशाला के आगे से होकर निकले, 255 | देखूँ कैसे थाम न लेती दामन उसका मधुशाला!।५१। 256 | 257 | और रसों में स्वाद तभी तक, दूर जभी तक है हाला, 258 | इतरा लें सब पात्र न जब तक, आगे आता है प्याला, 259 | कर लें पूजा शेख, पुजारी तब तक मस्जिद मन्दिर में 260 | घूँघट का पट खोल न जब तक झाँक रही है मधुशाला।।५२। 261 | 262 | आज करे परहेज़ जगत, पर, कल पीनी होगी हाला, 263 | आज करे इन्कार जगत पर कल पीना होगा प्याला, 264 | होने दो पैदा मद का महमूद जगत में कोई, फिर 265 | जहाँ अभी हैं मन्दिर मस्जिद वहाँ बनेगी मधुशाला।।५३। 266 | 267 | यज्ञ अग्नि सी धधक रही है मधु की भटठी की ज्वाला, 268 | ऋषि सा ध्यान लगा बैठा है हर मदिरा पीने वाला, 269 | मुनि कन्याओं सी मधुघट ले फिरतीं साकीबालाएँ, 270 | किसी तपोवन से क्या कम है मेरी पावन मधुशाला।।५४। 271 | 272 | सोम सुरा पुरखे पीते थे, हम कहते उसको हाला, 273 | द्रोणकलश जिसको कहते थे, आज वही मधुघट आला, 274 | वेदिवहित यह रस्म न छोड़ो वेदों के ठेकेदारों, 275 | युग युग से है पुजती आई नई नहीं है मधुशाला।।५५। 276 | 277 | वही वारूणी जो थी सागर मथकर निकली अब हाला, 278 | रंभा की संतान जगत में कहलाती 'साकीबाला', 279 | देव अदेव जिसे ले आए, संत महंत मिटा देंगे! 280 | किसमें कितना दम खम, इसको खूब समझती मधुशाला।।५६। 281 | 282 | कभी न सुन पड़ता, 'इसने, हा, छू दी मेरी हाला', 283 | कभी न कोई कहता, 'उसने जूठा कर डाला प्याला', 284 | सभी जाति के लोग यहाँ पर साथ बैठकर पीते हैं, 285 | सौ सुधारकों का करती है काम अकेले मधुशाला।।५७। 286 | 287 | श्रम, संकट, संताप, सभी तुम भूला करते पी हाला, 288 | सबक बड़ा तुम सीख चुके यदि सीखा रहना मतवाला, 289 | व्यर्थ बने जाते हो हिरजन, तुम तो मधुजन ही अच्छे, 290 | ठुकराते हैं मंदिरवाले, पलक बिछाती मधुशाला।।५८। 291 | 292 | एक तरह से सबका स्वागत करती है साकीबाला, 293 | अज्ञ विज्ञ में है क्या अंतर हो जाने पर मतवाला, 294 | रंक राव में भेद हुआ है कभी नहीं मदिरालय में, 295 | साम्यवाद की प्रथम प्रचारक है यह मेरी मधुशाला।।५९। 296 | 297 | बार बार मैंने आगे बढ़ आज नहीं माँगी हाला, 298 | समझ न लेना इससे मुझको साधारण पीने वाला, 299 | हो तो लेने दो ऐ साकी दूर प्रथम संकोचों को, 300 | मेरे ही स्वर से फिर सारी गूँज उठेगी मधुशाला।।६०। 301 | 302 | कल? कल पर विश्वास किया कब करता है पीनेवाला 303 | हो सकते कल कर जड़ जिनसे फिर फिर आज उठा प्याला, 304 | आज हाथ में था, वह खोया, कल का कौन भरोसा है, 305 | कल की हो न मुझे मधुशाला काल कुटिल की मधुशाला।।६१। 306 | 307 | आज मिला अवसर, तब फिर क्यों मैं न छकूँ जी-भर हाला 308 | आज मिला मौका, तब फिर क्यों ढाल न लूँ जी-भर प्याला, 309 | छेड़छाड़ अपने साकी से आज न क्यों जी-भर कर लूँ, 310 | एक बार ही तो मिलनी है जीवन की यह मधुशाला।।६२। 311 | 312 | आज सजीव बना लो, प्रेयसी, अपने अधरों का प्याला, 313 | भर लो, भर लो, भर लो इसमें, यौवन मधुरस की हाला, 314 | और लगा मेरे होठों से भूल हटाना तुम जाओ, 315 | अथक बनू मैं पीनेवाला, खुले प्रणय की मधुशाला।।६३। 316 | 317 | सुमुखी तुम्हारा, सुन्दर मुख ही, मुझको कन्चन का प्याला 318 | छलक रही है जिसमें माणिक रूप मधुर मादक हाला, 319 | मैं ही साकी बनता, मैं ही पीने वाला बनता हूँ 320 | जहाँ कहीं मिल बैठे हम तुम़ वहीं गयी हो मधुशाला।।६४। 321 | 322 | दो दिन ही मधु मुझे पिलाकर ऊब उठी साकीबाला, 323 | भरकर अब खिसका देती है वह मेरे आगे प्याला, 324 | नाज़, अदा, अंदाजों से अब, हाय पिलाना दूर हुआ, 325 | अब तो कर देती है केवल फ़र्ज़ - अदाई मधुशाला।।६५। 326 | 327 | छोटे-से जीवन में कितना प्यार करुँ, पी लूँ हाला, 328 | आने के ही साथ जगत में कहलाया 'जानेवाला', 329 | स्वागत के ही साथ विदा की होती देखी तैयारी, 330 | बंद लगी होने खुलते ही मेरी जीवन-मधुशाला।।६६। 331 | 332 | क्या पीना, निर्द्वन्द न जब तक ढाला प्यालों पर प्याला, 333 | क्या जीना, निश्चिंत न जब तक साथ रहे साकीबाला, 334 | खोने का भय, हाय, लगा है पाने के सुख के पीछे, 335 | मिलने का आनंद न देती मिलकर के भी मधुशाला।।६७। 336 | 337 | मुझे पिलाने को लाए हो इतनी थोड़ी-सी हाला! 338 | मुझे दिखाने को लाए हो एक यही छिछला प्याला! 339 | इतनी पी जीने से अच्छा सागर की ले प्यास मरुँ, 340 | सिंधु-तृषा दी किसने रचकर बिंदु-बराबर मधुशाला।।६८। 341 | 342 | क्या कहता है, रह न गई अब तेरे भाजन में हाला, 343 | क्या कहता है, अब न चलेगी मादक प्यालों की माला, 344 | थोड़ी पीकर प्यास बढ़ी तो शेष नहीं कुछ पीने को, 345 | प्यास बुझाने को बुलवाकर प्यास बढ़ाती मधुशाला।।६९। 346 | 347 | लिखी भाग्य में जितनी बस उतनी ही पाएगा हाला, 348 | लिखा भाग्य में जैसा बस वैसा ही पाएगा प्याला, 349 | लाख पटक तू हाथ पाँव, पर इससे कब कुछ होने का, 350 | लिखी भाग्य में जो तेरे बस वही मिलेगी मधुशाला।।७०। 351 | 352 | कर ले, कर ले कंजूसी तू मुझको देने में हाला, 353 | दे ले, दे ले तू मुझको बस यह टूटा फूटा प्याला, 354 | मैं तो सब्र इसी पर करता, तू पीछे पछताएगी, 355 | जब न रहूँगा मैं, तब मेरी याद करेगी मधुशाला।।७१। 356 | 357 | ध्यान मान का, अपमानों का छोड़ दिया जब पी हाला, 358 | गौरव भूला, आया कर में जब से मिट्टी का प्याला, 359 | साकी की अंदाज़ भरी झिड़की में क्या अपमान धरा, 360 | दुनिया भर की ठोकर खाकर पाई मैंने मधुशाला।।७२। 361 | 362 | क्षीण, क्षुद्र, क्षणभंगुर, दुर्बल मानव मिटटी का प्याला, 363 | भरी हुई है जिसके अंदर कटु-मधु जीवन की हाला, 364 | मृत्यु बनी है निर्दय साकी अपने शत-शत कर फैला, 365 | काल प्रबल है पीनेवाला, संसृति है यह मधुशाला।।७३। 366 | 367 | प्याले सा गढ़ हमें किसी ने भर दी जीवन की हाला, 368 | नशा न भाया, ढाला हमने ले लेकर मधु का प्याला, 369 | जब जीवन का दर्द उभरता उसे दबाते प्याले से, 370 | जगती के पहले साकी से जूझ रही है मधुशाला।।७४। 371 | 372 | अपने अंगूरों से तन में हमने भर ली है हाला, 373 | क्या कहते हो, शेख, नरक में हमें तपाएगी ज्वाला, 374 | तब तो मदिरा खूब खिंचेगी और पिएगा भी कोई, 375 | हमें नमक की ज्वाला में भी दीख पड़ेगी मधुशाला।।७५। 376 | 377 | यम आएगा लेने जब, तब खूब चलूँगा पी हाला, 378 | पीड़ा, संकट, कष्ट नरक के क्या समझेगा मतवाला, 379 | क्रूर, कठोर, कुटिल, कुविचारी, अन्यायी यमराजों के 380 | डंडों की जब मार पड़ेगी, आड़ करेगी मधुशाला।।७६। 381 | 382 | यदि इन अधरों से दो बातें प्रेम भरी करती हाला, 383 | यदि इन खाली हाथों का जी पल भर बहलाता प्याला, 384 | हानि बता, जग, तेरी क्या है, व्यर्थ मुझे बदनाम न कर, 385 | मेरे टूटे दिल का है बस एक खिलौना मधुशाला।।७७। 386 | 387 | याद न आए दुखमय जीवन इससे पी लेता हाला, 388 | जग चिंताओं से रहने को मुक्त, उठा लेता प्याला, 389 | शौक, साध के और स्वाद के हेतु पिया जग करता है, 390 | पर मै वह रोगी हूँ जिसकी एक दवा है मधुशाला।।७८। 391 | 392 | गिरती जाती है दिन प्रतिदन प्रणयनी प्राणों की हाला 393 | भग्न हुआ जाता दिन प्रतिदन सुभगे मेरा तन प्याला, 394 | रूठ रहा है मुझसे रूपसी, दिन दिन यौवन का साकी 395 | सूख रही है दिन दिन सुन्दरी, मेरी जीवन मधुशाला।।७९। 396 | 397 | यम आयेगा साकी बनकर साथ लिए काली हाला, 398 | पी न होश में फिर आएगा सुरा-विसुध यह मतवाला, 399 | यह अंतिम बेहोशी, अंतिम साकी, अंतिम प्याला है, 400 | पथिक, प्यार से पीना इसको फिर न मिलेगी मधुशाला।८०। 401 | 402 | ढलक रही है तन के घट से, संगिनी जब जीवन हाला 403 | पत्र गरल का ले जब अंतिम साकी है आनेवाला, 404 | हाथ स्पर्श भूले प्याले का, स्वाद सुरा जीव्हा भूले 405 | कानो में तुम कहती रहना, मधु का प्याला मधुशाला।।८१। 406 | 407 | मेरे अधरों पर हो अंतिम वस्तु न तुलसीदल प्याला 408 | मेरी जीव्हा पर हो अंतिम वस्तु न गंगाजल हाला, 409 | मेरे शव के पीछे चलने वालों याद इसे रखना 410 | राम नाम है सत्य न कहना, कहना सच्ची मधुशाला।।८२। 411 | 412 | मेरे शव पर वह रोये, हो जिसके आंसू में हाला 413 | आह भरे वो, जो हो सुरिभत मदिरा पी कर मतवाला, 414 | दे मुझको वो कान्धा जिनके पग मद डगमग होते हों 415 | और जलूं उस ठौर जहां पर कभी रही हो मधुशाला।।८३। 416 | 417 | और चिता पर जाये उंढेला पात्र न घ्रित का, पर प्याला 418 | कंठ बंधे अंगूर लता में मध्य न जल हो, पर हाला, 419 | प्राण प्रिये यदि श्राध करो तुम मेरा तो ऐसे करना 420 | पीने वालों को बुलवा कऱ खुलवा देना मधुशाला।।८४। 421 | 422 | नाम अगर कोई पूछे तो, कहना बस पीनेवाला 423 | काम ढालना, और ढालना सबको मदिरा का प्याला, 424 | जाति प्रिये, पूछे यदि कोई कह देना दीवानों की 425 | धर्म बताना प्यालों की ले माला जपना मधुशाला।।८५। 426 | 427 | ज्ञात हुआ यम आने को है ले अपनी काली हाला, 428 | पंडित अपनी पोथी भूला, साधू भूल गया माला, 429 | और पुजारी भूला पूजा, ज्ञान सभी ज्ञानी भूला, 430 | किन्तु न भूला मरकर के भी पीनेवाला मधुशाला।।८६। 431 | 432 | यम ले चलता है मुझको तो, चलने दे लेकर हाला, 433 | चलने दे साकी को मेरे साथ लिए कर में प्याला, 434 | स्वर्ग, नरक या जहाँ कहीं भी तेरा जी हो लेकर चल, 435 | ठौर सभी हैं एक तरह के साथ रहे यदि मधुशाला।।८७। 436 | 437 | पाप अगर पीना, समदोषी तो तीनों - साकी बाला, 438 | नित्य पिलानेवाला प्याला, पी जानेवाली हाला, 439 | साथ इन्हें भी ले चल मेरे न्याय यही बतलाता है, 440 | कैद जहाँ मैं हूँ, की जाए कैद वहीं पर मधुशाला।।८८। 441 | 442 | शांत सकी हो अब तक, साकी, पीकर किस उर की ज्वाला, 443 | 'और, और' की रटन लगाता जाता हर पीनेवाला, 444 | कितनी इच्छाएँ हर जानेवाला छोड़ यहाँ जाता! 445 | कितने अरमानों की बनकर कब्र खड़ी है मधुशाला।।८९। 446 | 447 | जो हाला मैं चाह रहा था, वह न मिली मुझको हाला, 448 | जो प्याला मैं माँग रहा था, वह न मिला मुझको प्याला, 449 | जिस साकी के पीछे मैं था दीवाना, न मिला साकी, 450 | जिसके पीछे था मैं पागल, हा न मिली वह मधुशाला!।९०। 451 | 452 | देख रहा हूँ अपने आगे कब से माणिक-सी हाला, 453 | देख रहा हूँ अपने आगे कब से कंचन का प्याला, 454 | 'बस अब पाया!'- कह-कह कब से दौड़ रहा इसके पीछे, 455 | किंतु रही है दूर क्षितिज-सी मुझसे मेरी मधुशाला।।९१। 456 | 457 | कभी निराशा का तम घिरता, छिप जाता मधु का प्याला, 458 | छिप जाती मदिरा की आभा, छिप जाती साकीबाला, 459 | कभी उजाला आशा करके प्याला फिर चमका जाती, 460 | आँख मिचौली खेल रही है मुझसे मेरी मधुशाला।।९२। 461 | 462 | 'आ आगे' कहकर कर पीछे कर लेती साकीबाला, 463 | होंठ लगाने को कहकर हर बार हटा लेती प्याला, 464 | नहीं मुझे मालूम कहाँ तक यह मुझको ले जाएगी, 465 | बढ़ा बढ़ाकर मुझको आगे, पीछे हटती मधुशाला।।९३। 466 | 467 | हाथों में आने-आने में, हाय, फिसल जाता प्याला, 468 | अधरों पर आने-आने में हाय, ढुलक जाती हाला, 469 | दुनियावालो, आकर मेरी किस्मत की ख़ूबी देखो, 470 | रह-रह जाती है बस मुझको मिलते-मिलते मधुशाला।।९४। 471 | 472 | प्राप्य नही है तो, हो जाती लुप्त नहीं फिर क्यों हाला, 473 | प्राप्य नही है तो, हो जाता लुप्त नहीं फिर क्यों प्याला, 474 | दूर न इतनी हिम्मत हारुँ, पास न इतनी पा जाऊँ, 475 | व्यर्थ मुझे दौड़ाती मरु में मृगजल बनकर मधुशाला।।९५। 476 | 477 | मिले न, पर, ललचा ललचा क्यों आकुल करती है हाला, 478 | मिले न, पर, तरसा तरसाकर क्यों तड़पाता है प्याला, 479 | हाय, नियति की विषम लेखनी मस्तक पर यह खोद गई 480 | 'दूर रहेगी मधु की धारा, पास रहेगी मधुशाला!'।९६। 481 | 482 | मदिरालय में कब से बैठा, पी न सका अब तक हाला, 483 | यत्न सहित भरता हूँ, कोई किंतु उलट देता प्याला, 484 | मानव-बल के आगे निर्बल भाग्य, सुना विद्यालय में, 485 | 'भाग्य प्रबल, मानव निर्बल' का पाठ पढ़ाती मधुशाला।।९७। 486 | 487 | किस्मत में था खाली खप्पर, खोज रहा था मैं प्याला, 488 | ढूँढ़ रहा था मैं मृगनयनी, किस्मत में थी मृगछाला, 489 | किसने अपना भाग्य समझने में मुझसा धोखा खाया, 490 | किस्मत में था अवघट मरघट, ढूँढ़ रहा था मधुशाला।।९८। 491 | 492 | उस प्याले से प्यार मुझे जो दूर हथेली से प्याला, 493 | उस हाला से चाव मुझे जो दूर अधर से है हाला, 494 | प्यार नहीं पा जाने में है, पाने के अरमानों में! 495 | पा जाता तब, हाय, न इतनी प्यारी लगती मधुशाला।।९९। 496 | 497 | साकी के पास है तनिक सी श्री, सुख, संपित की हाला, 498 | सब जग है पीने को आतुर ले ले किस्मत का प्याला, 499 | रेल ठेल कुछ आगे बढ़ते, बहुतेरे दबकर मरते, 500 | जीवन का संघर्ष नहीं है, भीड़ भरी है मधुशाला।।१००। 501 | 502 | साकी, जब है पास तुम्हारे इतनी थोड़ी सी हाला, 503 | क्यों पीने की अभिलषा से, करते सबको मतवाला, 504 | हम पिस पिसकर मरते हैं, तुम छिप छिपकर मुसकाते हो, 505 | हाय, हमारी पीड़ा से है क्रीड़ा करती मधुशाला।।१०१। 506 | 507 | साकी, मर खपकर यदि कोई आगे कर पाया प्याला, 508 | पी पाया केवल दो बूंदों से न अधिक तेरी हाला, 509 | जीवन भर का, हाय, पिरश्रम लूट लिया दो बूंदों ने, 510 | भोले मानव को ठगने के हेतु बनी है मधुशाला।।१०२। 511 | 512 | जिसने मुझको प्यासा रक्खा बनी रहे वह भी हाला, 513 | जिसने जीवन भर दौड़ाया बना रहे वह भी प्याला, 514 | मतवालों की जिह्वा से हैं कभी निकलते शाप नहीं, 515 | दुखी बनाया जिसने मुझको सुखी रहे वह मधुशाला!।१०३। 516 | 517 | नहीं चाहता, आगे बढ़कर छीनूँ औरों की हाला, 518 | नहीं चाहता, धक्के देकर, छीनूँ औरों का प्याला, 519 | साकी, मेरी ओर न देखो मुझको तनिक मलाल नहीं, 520 | इतना ही क्या कम आँखों से देख रहा हूँ मधुशाला।।१०४। 521 | 522 | मद, मदिरा, मधु, हाला सुन-सुन कर ही जब हूँ मतवाला, 523 | क्या गति होगी अधरों के जब नीचे आएगा प्याला, 524 | साकी, मेरे पास न आना मैं पागल हो जाऊँगा, 525 | प्यासा ही मैं मस्त, मुबारक हो तुमको ही मधुशाला।।१०५। 526 | 527 | क्या मुझको आवश्यकता है साकी से माँगूँ हाला, 528 | क्या मुझको आवश्यकता है साकी से चाहूँ प्याला, 529 | पीकर मदिरा मस्त हुआ तो प्यार किया क्या मदिरा से! 530 | मैं तो पागल हो उठता हूँ सुन लेता यदि मधुशाला।।१०६। 531 | 532 | देने को जो मुझे कहा था दे न सकी मुझको हाला, 533 | देने को जो मुझे कहा था दे न सका मुझको प्याला, 534 | समझ मनुज की दुर्बलता मैं कहा नहीं कुछ भी करता, 535 | किन्तु स्वयं ही देख मुझे अब शरमा जाती मधुशाला।।१०७। 536 | 537 | एक समय संतुष्ट बहुत था पा मैं थोड़ी-सी हाला, 538 | भोला-सा था मेरा साकी, छोटा-सा मेरा प्याला, 539 | छोटे-से इस जग की मेरे स्वर्ग बलाएँ लेता था, 540 | विस्तृत जग में, हाय, गई खो मेरी नन्ही मधुशाला!।१०८। 541 | 542 | बहुतेरे मदिरालय देखे, बहुतेरी देखी हाला, 543 | भाँति भाँति का आया मेरे हाथों में मधु का प्याला, 544 | एक एक से बढ़कर, सुन्दर साकी ने सत्कार किया, 545 | जँची न आँखों में, पर, कोई पहली जैसी मधुशाला।।१०९। 546 | 547 | एक समय छलका करती थी मेरे अधरों पर हाला, 548 | एक समय झूमा करता था मेरे हाथों पर प्याला, 549 | एक समय पीनेवाले, साकी आलिंगन करते थे, 550 | आज बनी हूँ निर्जन मरघट, एक समय थी मधुशाला।।११०। 551 | 552 | जला हृदय की भट्टी खींची मैंने आँसू की हाला, 553 | छलछल छलका करता इससे पल पल पलकों का प्याला, 554 | आँखें आज बनी हैं साकी, गाल गुलाबी पी होते, 555 | कहो न विरही मुझको, मैं हूँ चलती फिरती मधुशाला!।१११। 556 | 557 | कितनी जल्दी रंग बदलती है अपना चंचल हाला, 558 | कितनी जल्दी घिसने लगता हाथों में आकर प्याला, 559 | कितनी जल्दी साकी का आकर्षण घटने लगता है, 560 | प्रात नहीं थी वैसी, जैसी रात लगी थी मधुशाला।।११२। 561 | 562 | बूँद बूँद के हेतु कभी तुझको तरसाएगी हाला, 563 | कभी हाथ से छिन जाएगा तेरा यह मादक प्याला, 564 | पीनेवाले, साकी की मीठी बातों में मत आना, 565 | मेरे भी गुण यों ही गाती एक दिवस थी मधुशाला।।११३। 566 | 567 | छोड़ा मैंने पथ मतों को तब कहलाया मतवाला, 568 | चली सुरा मेरा पग धोने तोड़ा जब मैंने प्याला, 569 | अब मानी मधुशाला मेरे पीछे पीछे फिरती है, 570 | क्या कारण? अब छोड़ दिया है मैंने जाना मधुशाला।।११४। 571 | 572 | यह न समझना, पिया हलाहल मैंने, जब न मिली हाला, 573 | तब मैंने खप्पर अपनाया ले सकता था जब प्याला, 574 | जले हृदय को और जलाना सूझा, मैंने मरघट को 575 | अपनाया जब इन चरणों में लोट रही थी मधुशाला।।११५। 576 | 577 | कितनी आई और गई पी इस मदिरालय में हाला, 578 | टूट चुकी अब तक कितने ही मादक प्यालों की माला, 579 | कितने साकी अपना अपना काम खतम कर दूर गए, 580 | कितने पीनेवाले आए, किन्तु वही है मधुशाला।।११६। 581 | 582 | कितने होठों को रक्खेगी याद भला मादक हाला, 583 | कितने हाथों को रक्खेगा याद भला पागल प्याला, 584 | कितनी शक्लों को रक्खेगा याद भला भोला साकी, 585 | कितने पीनेवालों में है एक अकेली मधुशाला।।११७। 586 | 587 | दर दर घूम रहा था जब मैं चिल्लाता - हाला! हाला! 588 | मुझे न मिलता था मदिरालय, मुझे न मिलता था प्याला, 589 | मिलन हुआ, पर नहीं मिलनसुख लिखा हुआ था किस्मत में, 590 | मैं अब जमकर बैठ गया हूँ, घूम रही है मधुशाला।।११८। 591 | 592 | मैं मदिरालय के अंदर हूँ, मेरे हाथों में प्याला, 593 | प्याले में मदिरालय बिंबित करनेवाली है हाला, 594 | इस उधेड़-बुन में ही मेरा सारा जीवन बीत गया - 595 | मैं मधुशाला के अंदर या मेरे अंदर मधुशाला!।११९। 596 | 597 | किसे नहीं पीने से नाता, किसे नहीं भाता प्याला, 598 | इस जगती के मदिरालय में तरह-तरह की है हाला, 599 | अपनी-अपनी इच्छा के अनुसार सभी पी मदमाते, 600 | एक सभी का मादक साकी, एक सभी की मधुशाला।।१२०। 601 | 602 | वह हाला, कर शांत सके जो मेरे अंतर की ज्वाला, 603 | जिसमें मैं बिंबित-प्रतिबिंबित प्रतिपल, वह मेरा प्याला, 604 | मधुशाला वह नहीं जहाँ पर मदिरा बेची जाती है, 605 | भेंट जहाँ मस्ती की मिलती मेरी तो वह मधुशाला।।१२१। 606 | 607 | मतवालापन हाला से ले मैंने तज दी है हाला, 608 | पागलपन लेकर प्याले से, मैंने त्याग दिया प्याला, 609 | साकी से मिल, साकी में मिल अपनापन मैं भूल गया, 610 | मिल मधुशाला की मधुता में भूल गया मैं मधुशाला।।१२२। 611 | 612 | मदिरालय के द्वार ठोंकता किस्मत का छूंछा प्याला, 613 | गहरी, ठंडी सांसें भर भर कहता था हर मतवाला, 614 | कितनी थोड़ी सी यौवन की हाला, हा, मैं पी पाया! 615 | बंद हो गई कितनी जल्दी मेरी जीवन मधुशाला।।१२३। 616 | 617 | कहाँ गया वह स्वर्गिक साकी, कहाँ गयी सुरिभत हाला, 618 | कहाँ गया स्वपिनल मदिरालय, कहाँ गया स्वर्णिम प्याला! 619 | पीनेवालों ने मदिरा का मूल्य, हाय, कब पहचाना? 620 | फूट चुका जब मधु का प्याला, टूट चुकी जब मधुशाला।।१२४। 621 | 622 | अपने युग में सबको अनुपम ज्ञात हुई अपनी हाला, 623 | अपने युग में सबको अदभुत ज्ञात हुआ अपना प्याला, 624 | फिर भी वृद्धों से जब पूछा एक यही उत्तर पाया - 625 | अब न रहे वे पीनेवाले, अब न रही वह मधुशाला!।१२५। 626 | 627 | 'मय' को करके शुद्ध दिया अब नाम गया उसको, 'हाला' 628 | 'मीना' को 'मधुपात्र' दिया 'सागर' को नाम गया 'प्याला', 629 | क्यों न मौलवी चौंकें, बिचकें तिलक-त्रिपुंडी पंडित जी 630 | 'मय-महिफल' अब अपना ली है मैंने करके 'मधुशाला'।।१२६। 631 | 632 | कितने मर्म जता जाती है बार-बार आकर हाला, 633 | कितने भेद बता जाता है बार-बार आकर प्याला, 634 | कितने अर्थों को संकेतों से बतला जाता साकी, 635 | फिर भी पीनेवालों को है एक पहेली मधुशाला।।१२७। 636 | 637 | जितनी दिल की गहराई हो उतना गहरा है प्याला, 638 | जितनी मन की मादकता हो उतनी मादक है हाला, 639 | जितनी उर की भावुकता हो उतना सुन्दर साकी है, 640 | जितना ही जो रिसक, उसे है उतनी रसमय मधुशाला।।१२८। 641 | 642 | जिन अधरों को छुए, बना दे मस्त उन्हें मेरी हाला, 643 | जिस कर को छू दे, कर दे विक्षिप्त उसे मेरा प्याला, 644 | आँख चार हों जिसकी मेरे साकी से दीवाना हो, 645 | पागल बनकर नाचे वह जो आए मेरी मधुशाला।।१२९। 646 | 647 | हर जिव्हा पर देखी जाएगी मेरी मादक हाला 648 | हर कर में देखा जाएगा मेरे साकी का प्याला 649 | हर घर में चर्चा अब होगी मेरे मधुविक्रेता की 650 | हर आंगन में गमक उठेगी मेरी सुरिभत मधुशाला।।१३०। 651 | 652 | मेरी हाला में सबने पाई अपनी-अपनी हाला, 653 | मेरे प्याले में सबने पाया अपना-अपना प्याला, 654 | मेरे साकी में सबने अपना प्यारा साकी देखा, 655 | जिसकी जैसी रुचि थी उसने वैसी देखी मधुशाला।।१३१। 656 | 657 | यह मदिरालय के आँसू हैं, नहीं-नहीं मादक हाला, 658 | यह मदिरालय की आँखें हैं, नहीं-नहीं मधु का प्याला, 659 | किसी समय की सुखदस्मृति है साकी बनकर नाच रही, 660 | नहीं-नहीं कवि का हृदयांगण, यह विरहाकुल मधुशाला।।१३२। 661 | 662 | कुचल हसरतें कितनी अपनी, हाय, बना पाया हाला, 663 | कितने अरमानों को करके ख़ाक बना पाया प्याला! 664 | पी पीनेवाले चल देंगे, हाय, न कोई जानेगा, 665 | कितने मन के महल ढहे तब खड़ी हुई यह मधुशाला!।१३३। 666 | 667 | विश्व तुम्हारे विषमय जीवन में ला पाएगी हाला 668 | यदि थोड़ी-सी भी यह मेरी मदमाती साकीबाला, 669 | शून्य तुम्हारी घड़ियाँ कुछ भी यदि यह गुंजित कर पाई, 670 | जन्म सफल समझेगी जग में अपना मेरी मधुशाला।।१३४। 671 | 672 | बड़े-बड़े नाज़ों से मैंने पाली है साकीबाला, 673 | कलित कल्पना का ही इसने सदा उठाया है प्याला, 674 | मान-दुलारों से ही रखना इस मेरी सुकुमारी को, 675 | विश्व, तुम्हारे हाथों में अब सौंप रहा हूँ मधुशाला।।१३५। 676 | 677 | पिरिशष्ट से 678 | 679 | स्वयं नहीं पीता, औरों को, किन्तु पिला देता हाला, 680 | स्वयं नहीं छूता, औरों को, पर पकड़ा देता प्याला, 681 | पर उपदेश कुशल बहुतेरों से मैंने यह सीखा है, 682 | स्वयं नहीं जाता, औरों को पहुंचा देता मधुशाला। 683 | 684 | मैं कायस्थ कुलोदभव मेरे पुरखों ने इतना ढ़ाला, 685 | मेरे तन के लोहू में है पचहत्तर प्रतिशत हाला, 686 | पुश्तैनी अधिकार मुझे है मदिरालय के आँगन पर, 687 | मेरे दादों परदादों के हाथ बिकी थी मधुशाला। 688 | 689 | बहुतों के सिर चार दिनों तक चढ़कर उतर गई हाला, 690 | बहुतों के हाथों में दो दिन छलक झलक रीता प्याला, 691 | पर बढ़ती तासीर सुरा की साथ समय के, इससे ही 692 | और पुरानी होकर मेरी और नशीली मधुशाला। 693 | 694 | पितृ पक्ष में पुत्र उठाना अर्ध्य न कर में, पर प्याला 695 | बैठ कहीं पर जाना, गंगा सागर में भरकर हाला 696 | किसी जगह की मिटटी भीगे, तृप्ति मुझे मिल जाएगी 697 | तर्पण अर्पण करना मुझको, पढ़ पढ़ कर के मधुशाला। 698 | 699 | - बच्चन 700 | -------------------------------------------------------------------------------- /benchmark/data/English.txt: -------------------------------------------------------------------------------- 1 | Origins[edit] 2 | The standard Italian language has a poetic and literary origin in the twelfth century, and the modern standard of the language was largely shaped by relatively recent events. However, Italian as a language used in the Italian Peninsula has a longer history. In fact the earliest surviving texts that can definitely be called Italian (or more accurately, vernacular, as distinct from its predecessor Vulgar Latin) are legal formulae known as the Placiti Cassinesi from the Province of Benevento that date from 960–963, although the Veronese Riddle contains a late form of Vulgar Latin that can be seen as a very early Italian dialect.[13] What would come to be thought of as Italian was first formalized in the early fourteenth century through the works of Tuscan writer Dante Alighieri, written in his native Florentine. Dante's epic poems, known collectively as the Commedia, to which another Tuscan poet Giovanni Boccaccio later affixed the title Divina, were read throughout Italy and his written dialect became the "canonical standard" that all educated Italians could understand. Dante is still credited with standardizing the Italian language, and thus the dialect of Florence became the basis for what would become the official language of Italy. 3 | 4 | Italian often was an official language of the various Italian states predating unification, slowly usurping Latin, even when ruled by foreign powers (such as the Spanish in the Kingdom of Naples, or the Austrians in the Kingdom of Lombardy-Venetia), even though the masses spoke primarily vernacular languages and dialects. Italian was also one of the many recognised languages in the Austro-Hungarian Empire. 5 | 6 | Italy has always had a distinctive dialect for each city, because the cities, until recently, were thought of as city-states. Those dialects now have considerable variety. As Tuscan-derived Italian came to be used throughout Italy, features of local speech were naturally adopted, producing various versions of Regional Italian. The most characteristic differences, for instance, between Roman Italian and Milanese Italian are the gemination of initial consonants and the pronunciation of stressed "e", and of "s" in some cases: e.g. va bene "all right": is pronounced [va ˈbːɛne] by a Roman (and by any standard-speaker), [va ˈbene] by a Milanese (and by any speaker whose native dialect lies to the north of La Spezia–Rimini Line); a casa "at home" is [a ˈkːasa] for Roman and standard, [a ˈkaza] for Milanese and generally northern. 7 | 8 | In contrast to the Northern Italian language, southern Italian dialects and languages were largely untouched by the Franco-Occitan influences introduced to Italy, mainly by bards from France, during the Middle Ages but, after the Norman conquest of southern Italy, Sicily became the first Italian land to adopt Occitan lyric moods (and words) in poetry. Even in the case of Northern Italian language, however, scholars are careful not to overstate the effects of outsiders on the natural indigenous developments of the languages. 9 | 10 | The economic might and relatively advanced development of Tuscany at the time (Late Middle Ages) gave its dialect weight, though the Venetian language remained widespread in medieval Italian commercial life, and Ligurian (or Genoese) remained in use in maritime trade alongside the Mediterranean. The increasing political and cultural relevance of Florence during the periods of the rise of Medici's bank, Humanism, and the Renaissance made its dialect, or rather a refined version of it, a standard in the arts. 11 | 12 | Renaissance[edit] 13 | Main article: Italian Renaissance 14 | Starting with the Renaissance, Italian became the language used in the courts of every state in the peninsula. The rediscovery of Dante's De vulgari eloquentia and a renewed interest in linguistics in the sixteenth century, sparked a debate that raged throughout Italy concerning the criteria that should govern the establishment of a modern Italian literary and spoken language. Scholars divided into three factions: 15 | 16 | The purists, headed by Venetian Pietro Bembo (who, in his Gli Asolani, claimed the language might be based only on the great literary classics, such as Petrarch and some part of Boccaccio). The purists thought the Divine Comedy not dignified enough, because it used elements from non-lyric registers of the language. 17 | Niccolò Machiavelli and other Florentines preferred the version spoken by ordinary people in their own times. 18 | The courtiers, like Baldassare Castiglione and Gian Giorgio Trissino, insisted that each local vernacular contribute to the new standard. 19 | A fourth faction claimed the best Italian was the one that the papal court adopted, which was a mix of Florentine and the dialect of Rome. Eventually, Bembo's ideas prevailed, and the foundation of the Accademia della Crusca in Florence (1582–1583), the official legislative body of the Italian language led to publication of Agnolo Monosini's Latin tome Floris italicae linguae libri novem in 1604 followed by the first Italian dictionary in 1612. 20 | 21 | Modern era[edit] 22 | An important event that helped the diffusion of Italian was the conquest and occupation of Italy by Napoleon in the early nineteenth century (who was himself of Italian-Corsican descent). This conquest propelled the unification of Italy some decades after, and pushed the Italian language into a lingua franca used not only among clerks, nobility and functionaries in the Italian courts but also in the bourgeoisie. 23 | 24 | Contemporary times[edit] 25 | Italian literature's first modern novel, I Promessi Sposi (The Betrothed), by Alessandro Manzoni, further defined the standard by "rinsing" his Milanese "in the waters of the Arno" (Florence's river), as he states in the Preface to his 1840 edition. 26 | 27 | After unification a huge number of civil servants and soldiers recruited from all over the country introduced many more words and idioms from their home languages ("ciao" is derived from Venetian word "s-cia[v]o" (slave), "panettone" comes from Lombard word "panatton" etc.). Only 2.5% of Italy’s population could speak the Italian standardized language properly when the nation unified in 1861.[14] 28 | 29 | Classification[edit] 30 | Italian is a Romance language, and is therefore a descendant of Vulgar Latin. Standard Italian is based on Tuscan, especially its Florentine dialect, and is therefore an Italo-Dalmatian language, to which Sicilian and the extinct Dalmatian also belong, among a few others. 31 | 32 | Unlike most other Romance languages, Italian retains Latin's contrast between short and long consonants. As in most Romance languages, stress is distinctive. In particular, among the Romance languages, Italian is the closest to Latin in terms of vocabulary.[12] Lexical similarity is 89% with French, 88% with Catalan, 85% with Sardinian, 82% with Spanish and Portuguese, 78% with Rhaeto-Romance, and 77% with Romanian.[6][15] 33 | 34 | Geographic distribution[edit] 35 | 36 | The geographic distribution of the Italian language in the world: large Italian-speaking communities are shown in green; light blue indicates areas where the Italian language was used officially during the Italian colonial period. 37 | 38 | Use of the Italian language in Europe 39 | 40 | Use of the Italian language in Europe and former use in Africa 41 | Europe[edit] 42 | Italian is the official language of Italy and San Marino and is spoken fluently by the majority of the countries' populations. Italian is official, together with French, German and Romansch in Switzerland, with most of the 0.5 million speakers concentrated in the south of the country, in the cantons of Ticino and southern Graubünden (predominately in Italian Girgioni). Italian is the third most spoken language in Switzerland (after German and French), and its use has modestly declined since the 1970s.[16] Italian is also used in administration and official documents in Vatican City.[17] 43 | 44 | Italian is widely spoken in Malta, where nearly two-thirds of the population can speak it fluently, making it the most spoken non-official language in Europe in 2005.[18] Italian served as Malta's official language until 1934, while it is also recognized as an official language in Istria County, Croatia and Slovenian Istria, where there are significant and historic Italian populations.[citation needed] 45 | 46 | It is used as the official language of the Sovereign Military Order of Malta, a Roman Catholic chivalric order which, while not a nation per se, is still recognized as a sovereign subject of international law. 47 | 48 | Italian is also spoken by a minority in Monaco and France (especially in the southeast of the country and Corsica).[19][20] Small Italian-speaking minorities can also be found in Albania and Montenegro.[citation needed] 49 | 50 | Africa[edit] 51 | Due to heavy Italian influence during the Italian colonial period, Italian is still widely understood in the countries of Libya and Eritrea.[6] Although it was the primary language since colonial rule, Italian greatly declined under the rule of Muammar Gaddafi, who expelled the Italian Libyan population and made Arabic the sole official language of the country.[21] Nevertheless, Italian remains an important language in the education and economic sectors in Libya. In Eritrea, Italian is a principal language in commerce and the capital city Asmara still has an Italian-language school.[22] Italian was also introduced to Somalia through colonialism and was the sole official language of administration and education during the colonial period but declined after government, educational and economic infrastructure was destroyed in the Somali Civil War. Italian remains spoken as a second language by the elderly and the educated and is also used in the new Federal Government of Somalia.[23][24] 52 | 53 | Italian was also used in administration in Ethiopia when the country was briefly occupied by Italy from 1936 to 1941. 54 | 55 | Immigrant communities[edit] 56 | Although over 17 million Americans are of Italian descent, only a little over one million people in the United States speak Italian at home.[25] Nevertheless, an Italian language media market does exist in the country.[26] 57 | 58 | In Canada, Italian is the second most spoken non-official language when Chinese languages are not combined, with over 660,000 speakers (or abou 59 | -------------------------------------------------------------------------------- /benchmark/data/Korean.txt: -------------------------------------------------------------------------------- 1 | 야구 2 | 위키백과, 우리 모두의 백과사전. 3 | 이동: 둘러보기, 찾기 4 | 5 | 야구 6 | 일리노이 주 시카고의 리글리 필드 경기 장면 7 | 최고 기구 국제 야구 연맹 8 | 별칭 하드볼 9 | 기원 18세기 중반 잉글랜드 (초기 형태) 10 | 1846년 6월 19일 미국 11 | 뉴저지 주 호보컨 (공식 경기) 12 | 특징 13 | 팀 인원수 9명 14 | 분류 실외, 필드, 구기 15 | 장비 야구공, 야구 방망이, 글러브 16 | 경기장 야구장 17 | 올림픽 1992년~2008년 18 | 야구 경기 19 | 야구(野球, baseball)는 각각 아홉 또는 열 명으로 구성된 두 팀이 방망이와 공을 사용해 겨루는 구기 종목이다. 야구의 목표는 공을 방망이(배트)로 맞추어, 한 변이 27.432 미터(90 피트)인 정사각형의 각 꼭지점에 놓여 있는 루(壘, Base)를 밟은 뒤 마지막으로 본루(本壘, Home Plate)를 밟아서 득점하는 것이다.[1] [2]공격 팀은 아홉 타자가 순서대로 나와서 수비 팀의 투수가 던지는 공을 쳐서 다이아몬드의 각 루를 밟은 뒤 홈에 들어와야 하며, 동시에 수비 팀은 공격 팀의 타자들이나 주자들을 여러 가지 방법을 통해 아웃시켜서 공격 팀이 득점을 못 하도록 막아야 한다. 공격 팀의 타자들은 동료가 안타(간혹 2루타, 3루타를 치는 경우가 있으며 외야 펜스를 넘기거나 아웃 당하기 전에 홈으로 돌아오면 홈런이 된다)를 쳤을 경우 원하는 루에 멈춰서거나 홈으로 들어와 득점할 수 있다. 공격 팀이 아웃 세 번을 기록할 경우 수비 팀은 공격 팀으로, 공격 팀은 수비 팀으로 바뀐다. 이 세 번의 아웃을 이닝(Inning, 회)이라고 부르며, 프로 게임에서 한 경기는 아홉 개의 이닝으로 구성된다. 마지막 이닝이 끝날 때 더 많은 득점을 한 팀이 이기게 된다. 공격과 수비가 완전히 분리된 스포츠이다. 20 | 프로 야구, 아마추어 야구, 청소년 야구는 북아메리카, 중앙아메리카, 남아메리카, 카리브 제도의 여러 국가들, 동아시아, 동남아시아 국가들에서 인기가 있다. 야구의 근대적인 틀은 19세기 북아메리카에서 만들어졌다. 역사학자들은 야구의 원형은 북미 대륙에 건너 온 영국, 아일랜드 이민자들이 가지고 들어 온, 크리켓이나 라운더스와 같이 공과 방망이를 사용하는 구기 경기에서 시작되었다는 데 의견을 함께한다. 19세기 후반 야구는 미국의 국기(國技)로 널리 인정받게 되었다.목차 [숨기기] 21 | 1 야구의 명칭 22 | 2 야구의 역사 23 | 2.1 야구의 기원 24 | 2.2 미국에서의 발전 25 | 2.3 세계의 야구 26 | 2.3.1 한국 27 | 3 야구 규칙과 경기 진행 28 | 3.1 경기 용구 29 | 3.2 포지션 30 | 3.3 아웃 31 | 3.4 진루 32 | 4 야구의 인원 33 | 4.1 선수 명단 34 | 4.2 그 외 35 | 5 야구의 기본기와 전술 36 | 5.1 기본기 37 | 5.2 전술 38 | 6 야구의 고유한 스타일 39 | 6.1 시간적 요소 40 | 6.2 개인과 팀 41 | 7 경기장 42 | 8 기록 43 | 9 야구 단체 및 주요 대회 44 | 9.1 국제 야구 단체 45 | 9.2 야구 대회 46 | 9.3 야구 리그 47 | 10 같이 보기 48 | 11 참고 문헌 49 | 12 주석 50 | 13 바깥 고리 51 | 52 | [편집] 53 | 야구의 명칭 54 | 55 | 주만 가나에 56 | 57 | 야구의 명칭의 유래는 1894년 일본 제일고등중학교(현 도쿄 대학 교양학부)에서 재학중이던 주만 가나에가 'baseball'을 일본어 '野球(や-きゅう)'로 번역한 것이 대한민국으로 들어와 사용되고 있는 것이다. 그 외에도 일본의 문학가 마사오카 시키가 '배터(batter)', '러너(runner)', '베이스 온 볼스(base on balls)', '스트레이트(straight)', '쇼트스톱(shortstop)' 등의 미국식 야구용어를 '타자', '주자', '사구 (四球)대한민국에선 사구 대신 볼넷으로 사용)', '직구'(대한민국에서는 포심 속구, 투심, 컷 패스트볼로 부름.) '유격수'로 번역한 것이 대한민국에 들어와 쓰이고 있다.[3] 때때로 야구를 비슷한 경기인 소프트볼(softball)에 대비하여 하드볼(hardball)로 부르기도 한다. 58 | [편집] 59 | 야구의 역사 60 | 이 부분의 본문은 야구의 역사입니다. 61 | [편집] 62 | 야구의 기원 63 | 64 | 야구의 기원은 확실하게 짚어내기가 힘들다. 1344년에 출간된 프랑스의 한 책에 성직자들이 야구와 흡사한 라 술(La soule)이라는 게임을 즐기는 모습을 담은 삽화가 실려있다.[4] 원래 야구는 미국의 애브너 더블데이라는 군인 출신의 인물이 1839년에 쿠퍼스타운에서 창안했다고 알려졌다. 하지만 그가 직접 야구를 창안했다는 구체적인 증거가 없으며, 광산 기술자 출신의 애브너 그레이브스의 증언이 있었으나 별로 신뢰하기 어렵기 때문에 야구는 유럽에서 미국으로 전해진 것으로 추측된다.[5] 65 | 66 | 방망이와 공을 이용한 경기는 이미 오래 전부터 리디아인, 페르시아인, 인도인, 이집트인, 그리스인, 로마인 등에 의해 의식이나 오락으로 행해졌다. 이런 경기들은 정해진 규칙없이 여러 지역에서 행해졌다. 이런 여러가지 배트와 공을 이용하는 경기를 통해서 야구는 두드러진 발전을 할 수 있었다. 이런 발전을 통해서 1774년에 독일에서 프리드리히 구츠무츠가 존 뉴베리에서 출간한 《작고 귀여운 포켓북》(A Little Pretty Pocket-book)이라는 시집에서는 최초로 'Base-ball'이라는 단어가 들어가기도 했다.[6] 67 | 68 | 방망이와 공을 이용해 하는 경기는 영국에서 여러 가지 종류로 발전하는데, 영국 동남부에서는 크리켓으로, 남서부에서는 원홀 캣(또는 원 오캣)의 이름으로 발전했으며, 야구와 흡사한 경기인 라운더스도 있었다. 이런 종류의 경기들은 아메리카 대륙으로 옮겨와 두가지 형태로 진화했는데, 뉴욕 주변에서 행해진 타운볼은 각각 9명의 선수로 이루어진 두 팀이 하는 경기로 정비되었다. 69 | 70 | 알렉산더 카트라이트 71 | 72 | 루셔스 애덤스등은 야구의 기본적인 규칙을 확립했다. 특히 1845년에는, 미국 뉴욕의 알렉산더 카트라이트가 니커보커 규칙을 만들었으며, 이 규칙은 오늘날 현대 야구의 규칙으로 진화하게 된다.[7] 그는 또한 라운더스에서 사용되었던 말랑말랑한 공을 더 작지만 딱딱한 공으로 교체했다.[8] 1953년 6월 3일, 미국 의회는 공식적으로 카트라이트가 근대 야구의 발명가임을 인정했다. 73 | 74 | 카트라이트가 소속된 구단인 뉴욕 니커보커스 팀이 1845년에 경기를 했다는 기록이 있기는 하지만, 미국의 역사상 공식적인 첫 경기로 현재 알려지고 있는 것은 1846년 6월 19일 뉴저지 주의 '호보켄'에서,[9] '뉴욕 나인'[10]이 '니커보커스' 팀을 4이닝 동안 23 대 1로 이긴 경기이다.[11] 75 | [편집] 76 | 미국에서의 발전 77 | 78 | 1860년대 이미 미국에서는 야구가 대중적인 스포츠로 자리 잡았으며 선수들은 연봉을 받고 생활하는 프로 선수였으나 아마추어 선수처럼 생활해야 했다. 아마추어 시대는 1871년 3월 17일, 전미프로야구선수협회가 창설됨으로써 그 막을 내렸다. 1869년, 최초의 프로 야구 팀 신시내티 레드 스타킹스(Cincinnati Red Stockings)가 창단 되었으며 1875년에는 내셔널 리그(연봉 상한제 있음)가 창설되었다. 1882년에는 아메리칸 어소시에이션(American Association)이 창설되었고 1901년에는 이를 전신으로 하는 아메리칸 리그(연봉이 무제한임)가 창설되어 양대 리그체제를 갖추게 되었다. 1903년에는 양 리그의 우승 팀간의 승자를 겨루는 월드 시리즈(여기에서 월드(World)는 "월드신문사"의 이름으로써 신문사에서 스폰서를 해주기 때문에 월드시리즈라는 이름이 쓰인다고 한다)가 처음으로 치러졌으며, 1933년에는 올스타전이 처음으로 치러졌다.[12] 79 | 80 | 이후 많은 제도의 발전이 있었다. 브랜치 리키는 1920년에 대규모의 팜 시스템(Farm System)을 도입했다[13] 1975년에는 커드 플러드 등 여러 선수들의 희생으로 자유 계약 제도가 도입 되었다. 1980년에는 선수협 위원들이 구단주를 상대로 고소를 함으로써 연봉 상한선이 폐지되는 등 선수들의 권익이 향상되었다.[14] 81 | 82 | 재키 로빈슨 83 | 84 | 메이저 리그 야구에서는 1947년 이전까지 흑인이 선수로 활동하지 못했다. 그 대신 흑인들은 1920년에 설립된 니그로 리그에서 선수로 뛰었고, 1924년에는 최초의 니그로 월드 시리즈가 치러졌다. 메이저 리그 야구에서 흑인이 최초로 선수로 뛴 것은 1947년으로, 재키 로빈슨은 로스앤젤레스 다저스에 입단해 10년간 팀에 몸담았으며, 1962년에는 명예의 전당에 헌액된 최초의 흑인이 되었다.[15] 85 | 86 | 투수는 1960년대에서 1970년대 초반까지 경기에서 타석에 섰다. 1970년대 초반, 지명타자(designated hitter, DH) 규칙이 제안되었으며,[16] 아메리칸 리그에서는 1973년 이 규칙이 적용되기 시작해 투수가 타석에 서지 않게 되었고 지명타자는 타석에만 서면서 수비는 하지 않았다. 내셔널 리그에서는 지금도 투수가 타석에 선다. 87 | 88 | 메이저 리그 야구는 1980년대 초반까지 불법이었던 약물 복용이 흔했고, 이 시기가 되어서야 알려졌다. 또한 여러 선수들이 약물로 인해 사망했다. 1990년대 초반부터는 선수들이 근육강화제를 사용했으며, 이 때문에 2005년 3월 17일, 미국 의회는 스테로이드 사용에 관한 청문회가 열렸다. 이 때문에 메이저 리그 야구는 2006년부터 약물 복용이 처음 발각 되었을 때에는 50경기, 두 번째에는 100경기, 세 번째로 발각이 되면 영구 제명이 된다는 '삼진 아웃' 제도를 적용하기 시작했다.[17] 89 | 90 | 메이저 리그 야구는 점점 미국 전역으로 확대 되었는데, 팀이 미국 동부에서 서부로 많이 옮겨갔으며, 캐나다에서도 1969년 몬트리올 엑스포스(현 워싱턴 내셔널스)가, 1977년 토론토 블루제이스가 리그에 참가했다.[18] 현재는 내셔널 리그 16팀, 아메리칸 리그 14팀으로 팀 수 (목표는 모든 리그 16팀씩 32팀)가 유지가 되고 있으며, 경기 수는 한 시즌 당 162경기로 치러진다. 91 | [편집] 92 | 세계의 야구 93 | 94 | 야구의 픽토그램. 95 | 96 | 야구는 미국의 대표적인 스포츠 중 하나며, 다른 여러 나라에서도 팬들의 지지에 기반한 야구 체계가 갖추어져 있다. 캐나다 야구의 역사는 미국과 밀접하게 관련이 있는데, 1877년 프로리그와 국제 협회에서 두 나라로 이루어진 특색있는 팀을 만들기도 했었다. 97 | 98 | 세계적으로 미국과 캐나다가 아닌 다른 공식적 첫 야구 리그는 쿠바의 야구 리그이다. 쿠바는 오랜 전통을 유지하며 1930년대 후반부터 국제 경기에서 막강한 전력을 자랑하는 팀이라는 명예를 얻게 된다. 99 | 100 | 쿠바의 야구 리그가 만들어진 후 프로 리그가 생긴 국가는 다음과 같다. 제1차 세계 대전 후에 프로 리그가 만들어진 국가는 1922년 네덜란드, 1934년 오스트레일리아, 1936년 일본, 1938년 푸에르토 리코이며, 제2차 세계대전 이후에 프로 리그가 만들어진 국가는 1948년 이탈리아, 많은 라틴 아메리카의 나라들 중 가장 두드러진 나라, 1945년 베네수엘라, 1945년 멕시코, 1951년 도미니카 공화국과 1982년 대한민국, 1990년 타이완, 2003년 중국 순으로 만들어졌다. 2009년 현재, 국제 야구 연맹에는 현재 117개국이 가입했다.[19] 101 | 102 | 현재 야구는 미국, 일본, 대한민국 의 국가에서 가장 인기있는 스포츠 중 하나이다. MLB의 겨울 리그 프로그램으로 푸에르토 리코, 베네수엘라, 도미니카 공화국, 오스트레일리아에 겨울 리그가 존재하고, 멕시코는 MLB 하위 Triple-A 에서 리그 참여를 하고있다. MLB 는 푸에르토 리코, 베네수엘라, 도미니카 공화국,멕시코 가 참여하는 캐러비언 시리즈를 4년에 한번씩 개최하고 있다. 또한 이탈리아, 네덜란드, 중국, 타이완, 니카라과 에도 대회가 존재한다. 103 | 104 | 공식적 첫 야구 리그 였던 쿠바의 야구 리그는 1961년 쿠바 혁명으로 폐지 되었다. 자세한 내용은 하위항목 야구 리그 참조. 105 | 106 | 한편 2005년 7월 싱가포르에서 열린 2012년 하계 올림픽에 관한 117번째 회의에서 야구, 소프트볼 종목 삭제에 관한 투표가 진행되어 2012년 하계 올림픽에서 야구, 소프트볼 종목을 제외시키기로 결정했다. 이는 메이저 리거들이 출전하지 않기 때문이다.[20]. 또한 2009년 8월 회의에서 2016년 하계 올림픽 에도 야구 종목을 제외하기로 결정했다. 이 회의에서는 빅스타 선수가 참여하는 8팀, 짧은 5일 간의 경기 방식으로 바꾸라고 요구했다.[21] 107 | [편집] 108 | 한국 109 | 110 | 한국에 야구가 처음 들어온 것은 1905년으로, 당시 선교사로 온 미국인 질레트(P. L. Gillett)가 황성기독교청년회 회원들에게 야구를 가르친 것이 그 시초이다. 1906년 2월 11일 훈련원 터에서 YMCA팀 대 덕어(독일어)학교팀 사이에 최초의 야구경기가 열렸다. 《황성신문》1909년 3월 21일자엔 이러한 〈야구단 운동가〉라는 노래가 소개돼 있을 정도로 야구는 큰 인기를 누렸다: "무쇠 골격 돌 근육 소년 남아야/애국의 정신을 분발하여라/다달았네 다달았네 우리나라에/소년의 활동 시대 다달았네 /(후렴) 만인 대적(對敵) 연습하여 후일 전공 세우세/절세 영웅 대사업이 우리 목적이 아닌가" [22] 111 | [편집] 112 | 야구 규칙과 경기 진행 113 | 114 | 야구 경기장의 구조 115 | 이 부분의 본문은 야구 규칙입니다. 116 | 117 | 야구 경기는 두 팀이 서로 겨루는데, 경기가 진행되는 동안에 두 팀은 공격과 수비를 번갈아 가면서 진행한다. 그리고 공격 팀이 공격을 진행하면서 세 번의 아웃을 기록하면 공격 팀은 수비 팀으로, 수비 팀은 공격 팀으로 바뀐다. 그리고 이 세 번의 아웃을 이닝(inning, 회)이라고 하며, 일반적인 경기는 9이닝으로 구성되어 진행된다. 그리고 한 이닝은 초(初, 선공)와 말(末, 후공)로 구성된다. 그리고 한 이닝에 두 팀은 공격과 수비를 번갈아 가면서 경기를 진행하는데, 한 팀, 주로 홈팀이 말에 공격하며, 다른 한 팀, 주로 원정팀이 초에 공격한다. 야구 경기의 목표는 경기를 치르면서 상대 팀보다 더 많은 점수(득점)를 얻어 승리하는 것이다. 공격하는 팀의 선수들은 사각형 형태의 내야 다이아몬드 꼭지점에 있는 네 개의 베이스를 돌면 득점을 할 수 있다. 타자는 홈플레이트에서 타격을 하며 누상에 출루하고서는 반드시 시계반대방향으로 1루, 2루, 3루, 그리고 홈플레이트를 거쳐야 하며, 홈을 밟으면 득점이 된다. 반면 필드에서 수비를 보는 다른 팀은 아웃을 잡고 공격 팀이 점수를 내는 것을 막아야 한다. 아웃을 잡힌 선수는 배팅 오더에 따라 자신의 차례가 돌아올 때까지 공격을 할 수 없다. 세 개의 아웃카운트가 채워지면, 양 팀은 공격과 수비 역할을 교대하는 공수교대를 하며, 경기는 초에서 말로, 말에서 초로 바뀌게 된다. 9이닝동안 경기가 진행되다가 9회가 다 끝나도 점수가 같을 경우에는 연장전을 치뤄 승부를 낸다. 어린이 야구에서는 9이닝보다 적은 이닝으로 경기가 이루어지는게 보통이다.[23] 118 | [편집] 119 | 경기 용구 120 | 이 부분의 본문은 야구의 경기 용구입니다. 121 | 122 | 야구를 하기 위해서 기본적으로 필요한 것은 방망이, 야구공, 글러브, 야구 경기를 치를 수 있는 경기장이 필요하다. 123 | 방망이는 공격을 할 때 필요한 도구로, 보통 알루미늄이나 목재로 만든다. 배트는 길고 딱딱한 나무 막대기이고, 손잡이 부분을 제외하고 지름은 약 2인치(5 센티미터)이다. 손잡이 부분은 지름이 약 1인치(2.5 센티미터)이다. 124 | 야구공은 한 주먹 정도의 크기이고 빨간색 실이 들어간 흰색(다른 색일 수도 있다) 공이다. 소프트볼의 경우, 보통 주먹 두 개 정도 크기의 흰색 줄무늬가 있는 흰색이나 노랑색 공을 사용한다. 125 | 글러브 또는 미트는 수비할 때 필요한 도구로, 가죽으로 만들어졌으며, 선수의 손에 착용한다. 글러브의 모양은 사용하는 선수의 포지션에 따라 조금씩 다르다. 126 | 야구의 경기장은 선수의 나이, 능력에 따라서 크기가 달라진다. 하지만 모든 야구장은 다이아몬드와 모서리, 베이스(루) 127 | 야구공 128 | 가 있으며, 같은 방식의 경기를 진행한다. 경기장은 크게 내야와 외야로 구별된다. 129 | 야구공 130 | [편집] 131 | 포지션 132 | 이 부분의 본문은 야구의 포지션입니다. 133 | 134 | 야구의 포지션 135 | 136 | 이닝에서, 수비를 할 때 9명의 수비수들은 각자의 수비 위치에 선다. 다이아몬드의 중심의 투수판에 서 있는 선수를 투수라고 하며, 그리고 홈 플레이트 뒤에 앉아 있는 선수를 포수라고 하는데 이 둘을 배터리라고 부른다. 나머지 수비수들은 야수라고 부르는데 야수는 위치에 따라 내야수와 외야수로 분류되며 내야 안에 있는 4명의 수비수들을 내야수라고 한다. 내야수 중 3명은 1, 2, 3루에 서 있는데 이들은 각각 1루수, 2루수, 3루수라고 말하며 각 루와 그 주변을 수비하는 역할을 한다. 나머지 한명은 유격수로, 2루와 3루 사이의 서면서 그 사이를 수비한다. 그리고 나머지 3명의 선수는 외야에 서는데, 이들을 외야수라고 하며, 위치에 따라 좌익수(왼쪽), 중견수(가운데), 우익수(오른쪽)로 구분해서 부른다. 137 | 138 | 지명타자는 공격만 하고 수비는 하지 않는데, 이는 투수를 보호하기 위해 고안된 규칙으로 지명타자는 투수 대신 공격을 한다. 139 | 140 | 경기에서 홈플레이트 옆에 있는 타석에 서 공격을 하려는 선수를 '타자'라고 부르며, 타자는 배트를 잡고 있으며, 투수가 투수판에서 홈플레이트 쪽으로 공을 던지면 타자는 배트로 공을 쳐서 점수를 내려고 한다. 타자가 공을 치고 난 후에 타자는 배트를 놓고 1루를 향해 달려간다. 그리고 상황에 따라 2, 3루, 홈까지 갈 수 있다. 아웃이 된 경우에는 덕아웃으로 돌아간다. 141 | 142 | 투수는 타자가 베이스에 나가지 못하게 막기 위해 투수판에서 공을 던지는데, 공을 어디에 던지느냐에 따라 '스트라이크'(strike)와 '볼'(ball)로 구별된다. 타자는 스트라이크가 3개가 되면 아웃되지만, 볼이 4개가 되면 1루로 나갈 수 있다. 143 | 144 | 스트라이크를 던지는 방법은 다음과 같다. 145 | 투수가 공을 던졌는데 스트라이크 존(strike zone)을 통과한 경우. 146 | 타자가 공을 보고 방망이를 휘둘렀으나 맞지 않은 경우.(헛스윙) 147 | 타자가 공을 쳤으나 파울 라인이나 파울 폴(foul pole)을 기준으로 필드 바깥쪽으로 공이 날아간 경우. 이 경우를 파울(foul) 이라고 한다. 하지만 2 스트라이크 상태에서 파울이 된 경우에는 스트라이크가 추가되지 않는다. 148 | [편집] 149 | 아웃 150 | 타자가 친 공이 노바운드(친 공이 땅에 떨어지지 않는상태)로 야수들의 글러브나 미트에 들어간 경우. 151 | 스트라이크를 3번 허용한 경우(스윙이나 그냥 보거만 있거나 스트라이크 존 안에서 몸에 맞거나). 152 | 2스트라이크 상황에서 번트가 파울이 된 경우(스리번트 아웃). 153 | 타자가 친 공을 야수가 잡은 후 타자가 1루에 닿기 전에 1루수에게 던진 후 잡은 경우. 154 | 타자가 친 공을 야수가 잡은 후 타자가 1루에 닿기 전에 1루수에게 던진 후 잡은 공으로 타자를 태그 하는 경우. 155 | 타자가 친 공을 야수가 잡은 후 주자를 태그한 경우. 156 | 타자가 친 공을 야수가 잡은 후 주자가 진루할 루로 가서 포스아웃 하는 경우 157 | (단, 포스아웃 당할 주자의 원래의 루로 다음 주자 혹은 타자가 주루해야 하는 경우.). 158 | 타자가 친 공에 주자가 맞은 경우. 159 | 타자가 2루타 이상의 장타를 쳤는데 베이스를 밟지 않고 진루한 때 수비측이 그에 대해 어필(항의)을 한 경우(누의 공과). 160 | 2스트라이크 상황에서 타자가 공에 맞았지만 배트를 휘두른 경우. 161 | 타자가 친 공을 노바운드로 야수가 잡은 후, 주자가 원래의 루에 귀루하여 터치하지 않고 진루했을 때 주자나 베이스를 공으로 터치한 경우 162 | (이 경우 포스아웃이 아닌 어필아웃이다). 163 | 타자가 친 공이 야수가 충분히 노바운드로 잡을 수 있다고 판단한 경우에 관중들이 공을 잡은 경우. 164 | 노아웃이나 1아웃 주자 1,2루나 만루일때, 타자가 친 공이 내야수들이 충분히 잡을 수 있는 내야안의 경우라 판단 될 경우 (인필드 플라이). 165 | 타자가 공을 쳤고 수비수가 충분히 잡을 수 있는데 주자 혹은 타자가 쳐서 수비방해한 경우. 166 | 타순이 엉켜서 상대편이 어필한 경우.(예를들어 3번타자가 나와야 할 때 4번타자가 나와서 타격을 해서 안타 등이 나왔는데 어필하면 3번타자는 아웃이고 4번타자는 다시 쳐야 한다.) 167 | 2스트라이크 이후에 투수가 던진 공이 스트라이크 선언되거나 타자가 헛스윙을 하였는데 포수가 노바운드로 잡지 못하여 공을 타자에게 태그하거나 타자가 1루 베이스를 밟기 전에 1루에 던진 경우. (스트라이크 아웃 낫아웃) 168 | 노아웃 혹은 1아웃에서 1루 주자가 있을때 제3스트라이크가 선언되었으면 스트라이크 아웃 낫아웃이 적용되지 않고 그대로 스트라이크 아웃이 된다. 169 | 주자가 선행주자를 추월한 경우 170 | 주자나 타자가 태그를 피하기 위해 루와 루사이를 연결하는 가상의 직선에서 91.4cm 이상 떨어져 주루했을때 (타구를 처리하는 야수를 피해 달린것은 상관없다.) (스리피트라인 아웃) 171 | 2스트라이크 상황에서 주자가 번트를 시도하여 친공이 파울라인밖으로 나갈경우 172 | [편집] 173 | 진루 174 | 175 | 타자 또는 주자가 자신의 다음 베이스(타자의 경우에는 1루) 또는 그 이상에서 세이프되는 것을 진루라고 한다. 176 | 안타 : 히트(Hit)라고도 한다. 인플레이 상황에서 타구가 수비수가 잡을 수 없는 곳으로 갔을 때 안타라고 하며, 잡을 수 있는 공을 놓칠 때는 실책이라고 한다. 타자가 친 공이 땅바닥에 튀기지 않고 담장을 넘어가면 전광판에 안타라고 표시되지만, 주로 홈런이라고 하며, 모든 루를 돌아 홈플레이트를 밟고 득점할 수 있다. 177 | 볼넷 : 몸쪽에서 나간 공(볼)이 4개일 경우 진루하는 것을 말한다. 178 | 야수 선택 (필더스 초이스) : 야수의 기술적 실책이 아니라 두뇌적 실책에 의해서 주자가 진루하는 경우이다. 평범한 땅볼이 된 공을 잡은 야수가 1루에 타자 주자를 아웃시키는 대신, 선행주자를 아웃시키려고 다른 루에 송구하여 타자 주자가 1개 또는 그이상을 진루한 경우에 타자에게 주어지는 기록을 말한다. 179 | 실책 : 에러(Error)라고도 한다. 수비수가 잡아서 타자를 아웃을 시킬 수 있는 타구를 놓칠 때 쓰이는 말이다. 폭투, 도루 견제 때는 실책으로 인정하지 않는다. 2 스트라이크에서 헛스윙 삼진이 될 때, 그 공을 포수가 놓쳐서 그 사이에 타자가 1루에 무사히 갈 때는 스트라이크아웃 낫아웃이라고 한다. 180 | 몸에 맞은 볼 (힛바이피치드볼) : 타자의 몸에 공이 맞았을 때 1루로 진출할 수 있다.(스윙을 하지 않았을 경우) 정식 명칭은 '몸에 맞은 볼'이나 '힛바이피치드볼'이지만 보통 '데드볼'이라고 부른다. 181 | [편집] 182 | 야구의 인원 183 | [편집] 184 | 선수 명단 185 | 186 | 구원 투수가 몸을 풀고 있으며, 투수 코치가 그들을 살펴보고 있다. 187 | 188 | 최대 선수 명단 수는 리그 또는 수준에 따라 다르다. 메이저 리그 야구 팀은 선수 명단을 25명으로 유지하고 있다. 189 | 8명의 포지션 선수(position players)는 포수, 4명의 내야수, 3명의 외야수로 구성 된다. 190 | 5명의 선발 투수(starting pitchers)는 선발 로테이션을 구성한다.(6인도 있다.) 191 | 6명의 구원 투수(relief pitcher)에는 마무리 투수가 포함되며, 팀의 불펜을 구성한다. 192 | 1명의 백업 포수 193 | 2명의 백업 내야수 194 | 2명의 백업 외야수 195 | 1명의 지명타자, 또는 2번째의 백업 포수, 또는 7번째 구원 투수(seventh reliever) 196 | [편집] 197 | 그 외 198 | 199 | 팀의 감독 또는 수석 코치는 선수 명단, 타순, 선발 투수를 정하고, 특히 구원 투수의 경기 중의 등판 시점과 같은 선수교체 등과 같은 팀의 중요한 전술을 구상한다. 감독은 2명 또는 그 이상의 코치들의 도움을 받는다. 코치들은 타격 코치, 야수 코치, 투수 코치, 트레이닝 코치로 전문적인 책임을 가지고 있다. 대부분의 경기에선 팀이 공격을 할 때 1루 코치와 3루 코치가 경기장에 서 있는데 그들은 파울선의 밖에 정해진 장소에 서서 경기 중에 주자의 방향에 조언하고 경기 중단시에 감독의 지시를 타자와 주자에게 전달한다.[24] 200 | 이 부분의 본문은 야구 심판입니다. 201 | 202 | 야구의 주심 203 | 204 | 야구 경기에서 심판은 4명인데, 주심, 1루심, 2루심, 3루심으로 구성되어 있다. 먼저 주심은 포수 뒤에 서 있는데, 스트라이크 존을 통해서 스트라이크와 볼을 판정한다. 주심은 본루에서 아웃인지 세이프인지 판단하기도 한다. 그리고 나머지 1루심, 2루심, 3루심은 루 근처에서 서 있으며, 아웃인지 세이프인지 판정한다. 또한 타자가 하프 스윙 시에 주심이 스트라이크를 선고하지 않았을 경우에는 감독 또는 포수는 누심에게 조언을 받을 것을 요청할 수 있다. 좌우측 선심이 없는 경우 1, 3루심은 타자가 친 공이 외야에서 파울인지 아닌지 판단하기도 한다. 보크나 타임의 선언은 4심이 모두 동등한 권한을 갖는다. 205 | 206 | 메이저리그 야구에서는 보통 4명의 심판을 두는데, 올스타전이나 포스트 시즌 경기와 같이 중요한 시합의 경우 좌측 선심과 우측 선심을 추가하여 6명의 심판을 둔다. 그리고 2008년 8월부터는 비디오 판독제를 도입하기로 했다.[25] 207 | [편집] 208 | 야구의 기본기와 전술 209 | [편집] 210 | 기본기 211 | 212 | 야구는 기본적으로 야구공을 통해 이루어지는 경기인데, 공을 처리하는 것은 투구, 타격, 주루, 포구, 생각과 같은 동작으로 이루어진다.[26] 이에 따른 신체의 동작도 손(어깨), 발(다리), 눈, 입, 귀, 머리를 통해서 행해진다.[26] 손과 발은 투구, 타격, 주루, 포구에 필요한 수단이며, 눈은 잘볼 수 있는 수단이다.[26] 또한 야구는 단체스포츠이기 때문에 서로의 기분을 이해하고 동료의 플레이가 쉽게 되도록 서로 협조하는 팀워크가 필요하다.[27] 213 | 214 | 투구는 투수가 투수판을 밟고 타자에게 공을 던지는 행위를 뜻한다.[28] 투수는 좋은 투구를 위해서는 스피드와 제구가 좋은 공을 던져야 하고, 기본적인 속구 이외에도 커브, 포크볼과 같은 변화구를 던질줄 알아야 한다.[29] 또한 투수는 일반적인 와인드업 포지션과 주자 견제를 위한 세트 포지션을 사용한다.[28] 215 | 216 | 타격은 타자가 투수가 던진 공을 쳐내는 행위를 뜻한다. 스윙의 각도에 따라서 다운 스윙, 레벨 스윙, 어퍼 스윙으로 나뉜다.[28] 다운 스윙은 위에서 밑으로 내려치는 타법이며,[30] 레벨 스윙은 수평으로 휘두르는 타법으로 가장 이상적이며,[31] 어퍼 스윙은 밑에서 위로 올려치는 타법으로 가장 비효율적이다.[31] 217 | 218 | 주루는 루 상에 나간 주자의 플레이를 말한다. 일반적으로, 주루는 득점을 위해 홈으로 들어오기 위한 하나의 전략이다. 주루를 위해서는 주루 감각과 도루, 투수의 견제시 대비가 중요하다. 219 | [편집] 220 | 전술 221 | 222 | 야구 경기에서 팀은 승리하기 위해서 여러가지 전술을 사용한다. 예컨대, 일반적으로 우타자는 좌완 투수에게 강하며, 좌타자는 우완 투수에게 강하다.[32] 만약 상대 팀의 선발 투수가 좌완 투수일 때, 보통 좌타자 대신 우타자를 많이 기용하며, 좌타자는 기용되지 않거나 하위타선에 배치된다. 이런 점 때문에 우완 투수일 때는 좌타석, 좌완 투수일 때는 우타석에 서서 양손을 사용하는 스위치 히터가 생겨났다.[33] 223 | 224 | 타자가 번트를 시도하고 있다. 225 | 226 | 희생 번트는 루 상에 나가 있는 주자의 진루를 목표로 하는 전술으로, 주로 아웃 카운트가 유리한 무사 1루, 무사 2루, 무사 1·2루일 때 시도한다.[34] 스퀴즈 플레이는 주자가 3루에 있을 때, 번트를 대서 3루 주자가 득점하기 위한 전술이다.[35] 희생 플라이(일명 태그업)은 주자가 3루에 있을 때, 타자가 뜬공을 쳐 내면, 야수가 뜬공을 잡았을 때 3루주자는 득점하는 전술이다.[36] 도루는 투수가 투구를 하는 사이에 주자가 다음 루로 가려고 시도하는 것으로, 주로 발이 빠른 주자가 시도한다. 히트 앤 런(Hit and run)은 투수가 투구를 하는 사이 주자는 다음 루로 주루하며, 타자는 투수가 던진 공을 무조건 쳐서 최대한 많이 진루하려는 것이다. 런 앤 히트(Run and hit)는 투수가 투구를 하는 사이 주자가 다음 루로 주루하는 것은 같지만, 타자는 투수가 던진 공을 원하면 타격하는 전술이다. 런 앤 히트 작전이 시도됐을 때 타자가 타격하지 않았을 경우 주자의 도루 시도가 된다. 227 | 228 | 고의사구는 경기의 승부처(클러치)일 때, 잘 치는 타자가 나왔을 경우 그 타자를 볼넷으로 거르고 다음 타자와 상대해 더 큰 실점을 막으려는 전술이다. 루 상에 발이 빠르고 도루 가능성이 높은 주자가 나가있을 경우에는 투수가 포수에게 공을 하나 완전히 빼서 투구를 하는데, 도루를 대비해 주자를 견제하기 위한 것이다. 투수가 투구 전 또는 포수가 투구 후에 주자를 견제하기 위해서 주자가 있는 루의 야수에게 견제구를 던지기도 한다. 주자가 3루에 있을 때 내야 땅볼을 홈에 송구하기 위해서, 또는 타자가 번트한 공을 효율적으로 처리하기 위해서 야수들이 홈플레이트 쪽으로 이동해 수비를 한다.[37] 수비 위치는 타자의 타격 성향의 따라서 이동될 수 있다. 타자가 장타를 쳤을 때, 외야수는 잡은 공을 베이스에 있는 야수에게 송구하지 않고 보통 2루수 또는 유격수에게 송구를 하는데, 이를 중계 플레이라고 하며, 주자의 득점이나 진루를 방지하는 플레이이다. 229 | 230 | 전술의 지시는 보통 감독, 코칭스태프, 또는 선수간의 사인으로 전달되는데, 대부분 손짓으로 이루어진다. 사인의 종류에는 플래시 사인, 블록 사인, 키 사인 등이 있다.[38] 메이저 리그 야구에서는 9이닝을 기준으로 한 경기에 오가는 사인이 평균 1000여건 정도이다.[39] 231 | 232 | 경기는 모두 전술대로 진행하는 것은 아니며, 선수가 혼자서 독단적으로 플레이하는 경우도 있다. 예를 들어, 발이 빠른 주자들은 덕아웃 에서의 사인 지시 없이 자신의 판단으로 도루를 시도하는데, 이를 '그린라이트'(green light)라고 한다.[40] 233 | [편집] 234 | 야구의 고유한 스타일 235 | 236 | 야구는 미국의 스포츠 중에서 여러가지 면에서 독특한 특징을 갖는 스포츠이다. 이러한 독특함이 오랜기간 지속해 올 수 있었던 매력이자 미국인의 정신에 강한 연대감을 갖게 하는 큰 요인이다. 또한 많은 미국인들은 야구가 기술과 타이밍 그리고 열정, 전략의 최상의 조합이라고 생각한다. 철학자였던 모리스 라파엘 코언은 야구를 국민적 종교라고 묘사하기도 했다.[41] 이 점에서, 야구는 그의 사촌격인 크리켓과 유사한데, 많은 영연방 국가에서 크리켓과 그것과 관련된 문화는 미국 문화에서의 야구의 역할과 비슷한 지위와 영향력을 가진다. 237 | [편집] 238 | 시간적 요소 239 | 240 | 농구, 아이스하키, 미식축구, 그리고 축구는 모두 경기 시간이 정해져 있고, 보통 상대 팀에 직접적으로 저항해서 경쟁하는 것보다 정해져 있는 시간에서 공격에서 많은 시간을 차지한 팀에 의해 끝난다. 이와 반대로 야구는 경기 시간이 정해져 있지 않다. 팀은 마지막 타자가 나가기 전까지는 이길 수 없고 반격은 시간 제한을 받지 않는다. 비록 단체 종목과 반대되는 개인 종목들 중에서 경기 시간제한이 없어서 미국의 전문직들에게 인기가 많은 다른 스포츠로는 테니스와 골프가 있다. 241 | 242 | 최근 수십 년간, 관찰자들은 매년 야구 경기를 하는 데에 걸리는 시간이 꾸준히 증가한 것에 대한 정당성을 들어 프로 야구의 게임 길이를 비판해 왔다. 20세기에 들어서면서 게임 시간은 전형적으로 1시간 반 정도였다(1시간 반으로 정해졌다). 1920년대에는 평균 2시간 미만으로 변한 것이 1960년대에는 결국 2시간 38분으로 늘어났다.[42] 1975년에는 평균 2시간 25분으로 줄어 들었지만,[43] 21세기에 들어서면서 2003년 시즌 종료 직후 조사한 결과 평균 2시간 46분대가 되는 것으로 밝혀져 경기 시간이 더욱 길어지게 된 것으로 판명되었다.[42] 243 | 244 | 경기 시간이 늘어나는 것은 하프 이닝(half inning; 공수교대시간) 사이의 TV 광고, 늘어나는 반칙과 투구 인터벌, 그리고 느린 경기 흐름 때문이었다. 결국 메이저 리그는 하프 이닝 사이의 쉬는 시간의 최대 시간을 정하는 반면 심판이 더욱 엄격하게 스트라이크 존과 시간 규칙을 선수들이 지키게 강요하도록 교육했다.[42] [43] 2008년, 일본의 프로 야구는 2007년부터 과거 10년간의 평균 경기 시간이었던 3시간 18분의 6%(교토 의정서의 온실가스 배출량 감축 목표에서 따온 것이다)인 12분 줄이는 것을 목표로 삼았다.[44] 245 | 246 | 이러한 제한 시간이 없는 특징 때문에 야구계 일각에서는 승부가 연장으로 이어질 시에 빠르게 승부를 낼 수 있는 규칙으로서 이른바 승부치기를 도입하는 것이 논의되고 있기도 하다. 실제 베이징 올림픽에서는 승부치기 제도가 실시된 바 있으나, 승부치기 제도가 일반적인 것은 아니며 전 세계 거의 대부분의 프로 야구 리그에서는 아직 승부치기 제도를 도입하지 않고 있다. 247 | 248 | 공식적인 규칙에 명기되어 있기는 하지만 루(Base) 상에 주자가 없을 경우 투수는 12초 안에 투구해야 하며 이를 어길 시 그 투구는 '볼(Ball)'로 판정이 된다는 경기 촉진룰의 적용은 매우 드물고 아주 만약의 상황에만 시행 된다. 그러나 2010년도 프로야구에서는 이 12초룰을 적용키로 하여 투수에 유리한 룰이 아니냐며 타자들이 반발하고 있는 추세다. 심판은 또한 주자가 있을 경우에도 투수의 투구 지연 행위를 볼(Ball)로 판정할 수 있는 권리도 가지고 있는데 이 규칙 또한 매우 드물고 만약의 상황에만 시행된다. 공식 규칙 중에는 또한 주심이 타자에게 타격행위가 끝나지 않았을 경우 타자석을 벗어나지 않도록 요청할 수 있는 규칙이 있다. 그 이외의 다른 규칙으로는 '규칙위반을 하는지 주시하라'가 있다. 249 | [편집] 250 | 개인과 팀 251 | 252 | 야구는 근본적으로 팀 스포츠이다. 명예의 전당에 들어갈 정도로 훌륭한 실력을 가졌으며 높은 연봉을 받는 두, 세 명 정도의 선수를 보유할 정도로 재정이 좋은 지역 연고 구단이라 하더라도 기량이 우수한 선수들이 반드시 성공을 기대할 수는 없으며, 여전히 선수 개인들은 강한 압박과 시험에 놓이게 된다. 투수는 반드시 훌륭한 투구를 해야하며 만약 그렇지 못할 경우 시합에 질 위험이 크고, 타자는 극히 짧은 순간에 어떤 구질인지, 스윙을 해야 할지, 말아야 할지를 결정해야 한다. 감독과 코치가 어떤 작전을 수행할지를 선수들에게 사인을 줄 수는 있지만, 그 어느 누구도 투수가 투구하는 것을, 타자가 타격하는 것을 도와 줄 수는 없다. 타자가 직선타구를 치게 되면, 최종 수비자인 외야수들은 볼을 잡아야 할지, 바운드 볼로 처리해야 할지를 혼자서 결정한다. 야구의 역사에서는 영웅적 대접을 받는 선수와 비난을 받는 선수들이 많다 - 시합의 승부처(클러치)에서 한 선수가 적시 안타를 치거나 또는 공을 잡아 플라이 아웃 시킬 수도 있지만, 또는 그 반대로 예상치 못한 삼진 아웃을 당하거나 수비에서 실책을 해서 모두에게 뚜렷이 각인되는 결과를 낳았다. 253 | 254 | 또한 야구에서 모든 선수들이 주자로 뛸 수 있으며 이 때문에 야구에서는 단거리 달리기가 매우 중요하다. 굳이 주자가 아니더라도 포수를 제외한 모든 포지션에서 뛰어난 단거리 달리기 능력이 요구된다. 단거리를 빠른 속도로 달리는 능력이야말로 야구의 기본기이다. 255 | [편집] 256 | 경기장 257 | 이 부분의 본문은 야구장입니다. 258 | 259 | 리글리 필드의 득점판. 2005년 7월 27일, 시카고 컵스 - 플로리다 말린스의 경기. 260 | 261 | 야구 규칙에 따르면 경기장에 대한 규정은 다음과 같다.[1][45] 262 | 본루에서 1루, 1루에서 2루, 2루에서 3루, 3루에서 본루까지의 거리는 각각 27.432m(90피트)이다. 내야의 중앙 부근에 본루로부터 25.4cm(10인치)의 높이가 되도록 흙을 쌓아 올려 그곳에 투수판을 놓고 투수판 앞 15.2cm(6인치)되는 지점으로부터 본루를 향해 182.8cm(6피트)되는 지점까지, 경사도는 12:1이여야한다. 본루로부터 백 스톱까지의 거리 및 루선으로부터 파울지역에 있는 펜스, 스탠드 또는 플레이에 방해가 되는 시설까지의 거리는 18.288m(60피트) 이상이 되어야 한다. 내야는 한 변이 27.432m(90피트)인 정사각형이고 외야는 1루선과 3루선을 연장한 파울 라인 사이의 지역이다. 본루부터 페어지역에 있는 펜스, 스탠드 또는 플레이에 방해가 되는 시설까지의 거리는 76.199m(250피트) 이상이어야 한다. 경계선을 포함한 내야 및 외야는 페어지역이고 다른 지역은 파울지역이다. 263 | 1958년 6월 1일 이후 프로야구를 위해 건설하는 경기장은 본부로부터 좌우의 펜스, 스탠드 또는 좌우의 페어지역 위에 있는 플레이에 방해가 되는 시설까지의 거리는 99.058m(325피트) 이상, 중견의 펜스까지의 거리는 121.918m(400피트) 이상이여야한다. 264 | 본루는 오각형의 흰색 고무판으로 표시한다. 이 오각형을 만들 때에는 먼저 한 변이 43.2cm(17인치)인 정사각형을 그려, 이 중 한 변을 골라 이에 이웃한 양쪽의 변을 21.6cm(8½인치)로 줄인다. 이 변에서 밑변의 중심으로 각 30.5cm(12인치)의 변을 2개 만든다. 30.5cm(12인치)의 두 변이 만나는 곳을 1루선과 3루선의 교차점에 두고, 43.2cm(17인치)의 변을 투수판 쪽으로 해서 그 표면이 지면과 수평이 되도록 고정시킨다. 265 | 1루, 2루, 3루는 흰색 캔버스 백으로 표시하고 땅에 올바르게 고정시킨다. 1루와 3루의 캔버스 백은 완전히 내야 안쪽으로 들어가게 설치하고, 2루의 캔버스 백은 2루지점에 그 중심이 놓이도록 설치한다. 캔버스 백은 그 속에 부드러운 재료를 넣어서 만들고 그 크기는 38.1cm(15인치) 평방, 두께는 7.6cm(3인치)에서 12.7cm(5인치)까지 허용된다. 266 | 투수판은 가로 61cm(24인치), 세로 15.2cm(6인치)의 직사각형 흰색 고무 평판으로 만든다. 투수판은 그 앞쪽면 중앙으로부터 본루까지의 거리가 18.44m(60피트 6인치)가 되게 한다. 267 | 본거지 구단은 1루선과 3루선으로부터 적어도 7.62m(25피트) 떨어진 곳에 본거지 구단 및 방문 구단용으로 각 1개씩의 선수용 벤치를 설치하여야 하며, 이 벤치는 양 옆과 뒷 쪽을 둘러싸고 지붕을 씌워야 한다. 268 | [편집] 269 | 기록 270 | 이 부분의 본문은 야구의 기록입니다. 271 | 272 | 많은 스포츠 중에서 혹은 그보다 휠씬 더, 야구에서의 기록은 대단히 중요한 의미를 갖는다. 야구 기록은 미국 프로 야구인 메이저 리그의 태동과 함께 유지되어 왔으며 생각컨대 이전보다 더 일반적인 것이 되었다. 단장, 스카우터, 감독 그리고 선수들은 자신이 속한 팀의 승리를 위한 다양한 전략선택에 도움을 주기 위해 기록을 연구한다. 273 | 274 | 야구에서의 기록은 여러 가지 이유로 다른 스포츠들보다 더 중요한 의미를 갖는 가장 중요한 이유는 다른 운동 경기들에서의 플레이는 유동적이고 다양한 결과를 보여주지만, 야구에서의 플레이는 제한된 결과만을 갖기 때문이다. 275 | 276 | 모든 세대의 야구팬은 다음과 같은 전통적인 야구 기록에 대해 알고 있으며 또한 그 내용에 관해 의견을 교환한다. 277 | '타수'(打數, At-bats, AB)는 타자가 타석에서 타격행위를 완료한 총 횟수를 의미한다. 타수에는 타자가 타격행위를 완료하지 않은 타석은 제외하는데 볼넷과 몸에 맞는 볼이 그러한 경우이다. 278 | 타자의 '타율'(打率, Batting Average, AVG)은 '안타'의 수를 '타수'로 나눈 값이다.[46] 이것은 타자의 타격능력을 보여주는 가장 기본적인 통계수치이다. 279 | 투수의 '평균자책점'(Earned Run Average, ERA, 일본 야구에서는 '방어율'(防禦率)이란 용어를 사용)은 투수가 투구한 총 이닝과 허용한 자책점을 평균적으로 환산하여 9 이닝당 자책점(투구와 관련없는 수비행위로 인한 실점은 제외)으로 보여주는 통계수치이다. 약어로는 'ERA'로 표기한다. 280 | 투수의 '이닝'(Inning, IP(Inning Pitched))은 투구행동의 기본단위이다. 보통 양팀의 공수교대를 1이닝으로 표현하기도 하지만, 투수가 얼마나 던졌는지를 가늠하는 것도 이닝이다. 투구수와는 상관없이 1-아웃카운트를 잡았을 경우 ⅓(0.1)이닝 2-아웃카운트를 잡았을 경우 ⅔(0.2)이닝이라 표현, 3명의 타자를 아웃시키면 1이닝으로 표현된다. (또는 0.3, 0.7, 1로 표현) 연속성은 상관이 없이 기록된다. 투구에 의한 아웃이 아니라, 견제사에 의한 아웃도 인정되므로 투구수 없이 이닝을 기록할 수도 있다. 이것은 주로 투수의 내구력과, 지구력에 대한 척도가 되곤 한다. 281 | '도루'(Stolen Bases, SB)는 투수의 투구행동시 다음 루로의 진루를 하는 행위이다. 얼마나 빠른지에 대한 수치적인 기준이 되며, 도루가 많을수록 공격의 효율성이 좋아진다. 282 | 세이버매트릭스(Sabermetrics) 283 | 284 | 미국 야구 연구 협회(The Society for American Baseball Research, SABR)는 야구 선수의 성과와 팀 기여도를 보다 더 잘 측정하고 상대적 가치에 관한 좀 더 추상적인 질문에 대한 답을 제공하기 위해 혁신적인 통계 수치를 개발해왔다('세이버매트릭스'란 용어는 학문의 분야와 고안된 특정 통계수치를 의미한다). 285 | 286 | 몇몇 세이버매트릭스 신봉자들이 야구계의 주류로 편입함에 따라 '세이버매트릭스'의 통계기록은 일반적으로 사용되기 시작했으며, 내용은 다음과 같다. 287 | 'OPS'(출루율과 장타율을 합한 것)는 타율보다 타자들의 성과를 더 잘 측정한다고 세이버매트릭스를 믿는 사람들이 말하는 다소 복잡한 공식이다. 타자의 '출루율 : (안타 + 볼넷 + 사구) / (타수+볼넷 +사구 + 희생플라이)'[46] 과 '장타율 : 총루타수 / 타수'[47]를 더한 값이다.[48] 288 | 'WHIP'(투구이닝 당 허용한 볼넷과 안타의 합)[49]은 투수의 능력을 잘 보여주는 통계수치이다. 289 | 특정 상황에 따른 통계기록 290 | 291 | 특정 상황에서 좀 더 세밀한 통계수치는 더욱 중요해진다. 예를 들어, 좌완 투수의 공을 잘 치는 타자의 경우 감독은 왼손 투수를 상대하기 위해 그 선수에게 좀 더 많은 기회를 줄 것이다. 득점상황에서 더 잘 치는 타자들이 나왔을 경우 상대팀 감독은 득점권 타율이 낮은 타자와 승부하기 위해 그 타자를 고의사구로 내보내려고 할 것이다. 292 | 293 | 다른 통계 기록들도 있는데 위에서 언급한 통계수치들보다 덜 중요할지도 모른다. 타자의 경우 타수, 안타수, 장타수 그리고 타점이고 투수의 경우는 투구 이닝수, 9이닝 당 삼진수, 볼넷, 투구 수 등이다. 294 | [편집] 295 | 야구 단체 및 주요 대회 296 | [편집] 297 | 국제 야구 단체 298 | 299 | 국제 야구 연맹에 가입된 국가. 300 | 301 | 국제 야구 연맹은 1938년에 설립되었으며, 117개국이 가맹하고 있다.[19] 그리고 대륙별로도 연맹이 조직되어 있어 있으며, 다음과 같이 소속되어 있다. 302 | 303 | 아프리카 야구·소프트볼 협회(ABSA) - 16개국 304 | 305 | 팬아메리칸 야구 연맹(COPABE, 스페인어: Confederación Panamericana de Béisbol) - 26개국 306 | 307 | 아시아 야구 연맹 (BFA) - 20개국 308 | 309 | 유럽 야구 연맹 (CEB, 프랑스어: Confédération Européenne de Baseball) - 40개국 310 | 311 | 오세아니아 야구 연맹 (BCO) - 15개국 312 | [편집] 313 | 야구 대회 314 | 315 | 세계의 주요 야구 대회에는 야구 월드컵, 대륙간컵 등이 있다. 하지만 이런 대회들은 아마추어 선수들만 참가하고 메이저 리그 야구 선수는 참여하지 않는다. 올림픽 야구 또한 메이저 리그 야구 선수들은 참여하지 않는데, 이 때문에 2012년 하계 올림픽에서 야구와 소프트볼이 제외된 이유가 되기도 한다. 유니버시아드 야구, 세계 청소년 야구 선수권 대회, 유스 베이스볼 월드 챔피언십은 대학, 청소년을 위한 대회이다. 여자 야구 대회로는 여자 야구 월드컵이 있다. 316 | 317 | 메이저 리그 야구 사무국은 야구의 열기 확대를 위해서 메이저 리그 야구 선수들도 참가하는 프로 야구 대회인 WBC(월드 베이스볼 클래식)을 2006년에 개최했다. 이 대회는 2009년에 열린 후 그 이후로는 4년마다 열릴 예정이다.[50] 318 | 319 | 각 대륙별 대회는 다음과 같다. 320 | 아프리카 - 올아프리카 게임 야구 321 | 아메리카 - 팬아메리칸 게임 야구 322 | 아시아 - 아시아 야구 선수권 대회 323 | 유럽 - 유럽 야구 선수권 대회 324 | 오세아니아 - 오세아니아 야구 선수권 대회 325 | [편집] 326 | 야구 리그 327 | 328 | 세계 야구에서 가장 큰 규모의 프로 야구 리그는 미국의 메이저 리그 야구로, 내셔널 리그 16팀, 아메리칸 리그 14팀, 총 30개의 팀으로 각각 서부, 중부, 동부 지구로 나뉘어 있다. 329 | 330 | 메이저 리그 야구 밑으로는 트리플A, 더블A, 싱글A, 루키 등의 하위 리그들이 각 연고지마다 분포되있다. 그리고 메이저리그와는 별개로 독립리그들이 북중미권에 여럿 있다. 331 | 332 | 또한 네덜란드, 이탈리아, 오스트레일리아, 푸에르토리코, 도미니카 공화국, 파나마, 콜롬비아, 베네수엘라, 니카라과, 캐나다 등에도 리그가 있으며, 특히 카리브해 국가들의 리그는 기후상 겨울에도 리그를 연다. 쿠바는 공산국가 특유상 프로리그는 없지만 아마추어 국제대회에서는 상당한 실력을 보인다. 333 | 334 | 아시아에선 일본의 센트럴 리그와 퍼시픽 리그와 독립리그들이 있으며, 그 외에 대한민국, 타이완, 필리핀 등이 대표적이다. 335 | 336 | 또한 야구 리그는 난이도에 따라, 예를 들어서 아마추어, 프로에 따라서, 또는 성별에 따라, 나이에 따라서 리그가 다르다. 어린이 프로그램은 야구 규칙에 보다 더 쉬운 규칙을 적용하고 더 작은 구장에서 경기를 치르며, 코치나 기계로부터 보다 더 쉬운 투구를 한다. 또한 아마추어, 논-프로도 공식 야구 규칙에서 변형된 규칙을 사용한다. 337 | 338 | 야구 리그는 아메리카, 아시아, 유럽, 오세아니아 등에 존재한다. 특히 아시아의 경우 일본에서는 센트럴 리그와 퍼시픽 리그라는 양대 리그가 있다. 339 | 340 | 대한민국에서는 1982년 한국야구위원회 창설로 프로야구가 설립되었으며 롯데 자이언츠, 삼성 라이온즈, 해태 타이거즈, MBC 청룡, OB 베어스, 삼미 슈퍼스타즈 등 6개 팀으로 시작 2013년 현재는 삼성 라이온즈, SK 와이번스, 롯데 자이언츠, 두산 베어스, KIA 타이거즈. 넥센 히어로즈, LG 트윈스, 한화 이글스, NC 다이노스 등 9개 팀으로 리그가 진행중이다. 현재 대한민국 프로야구는 10구단 창설 논의가 진행중이며, 2013년에 10구단의 모기업이 결정될 예정이다. 10구단에 관심이 있는 지역과 모기업은 수원시와 KT의 연합과 전라북도와 부영의 연합이다. 341 | [편집] 342 | 같이 보기야구 규칙/경기 진행 343 | 야구의 경기 용구 344 | 야구의 포지션 345 | 야구의 기록 346 | 야구의 점수 기록 347 | 야구장 야구 문화 348 | 분류:야구 문화 349 | 분류:야구 영화 350 | 분류:야구 게임 351 | 분류:야구상 352 | 야구 은어 353 | 야구 카드 354 | 야구 명예의 전당 355 | 스피드건(en:Speed gun) 356 | 357 | 야구 관련 스포츠 358 | 방망이와 공을 이용하는 경기 359 | 마운드볼 360 | 오이나 361 | 소프트볼 362 | 크리켓 363 | 스틱볼 364 | 원 홀캣 365 | 타운볼 366 | 라프타 367 | 스툴볼 368 | 티볼 369 | 370 | [편집] 371 | 참고 문헌 372 | 조지 벡시. 《야구의 역사》. 을유문화사. 8932430799 373 | 설리번 딘. 《Early Innings: A Documentary History of Baseball, 1825-1908》. U of Nebraska Press. 0803292449 374 | 설리번 딘. 《Late Innings: A Documentary History of Baseball, 1945-1972》. U of Nebraska Press. 0803292856 375 | 잭 스탈링스, 밥 베넷 (2003). 《Baseball Strategies: Your Guide to the Game Within the Game》. American Baseball Coaches Association/Human Kinetics. ISBN 0-7360-4218-0, OCLC 50203866 376 | 하일성. 《최신 야구교실》. 국일미디어. ISBN 978-89-7425-228-1 377 | [편집] 378 | 주석 379 | ↑ 가 나 한국야구위원회. 한국야구위원회 : 경기규칙. 2012년 2월 23일에 확인. 380 | ↑ Major League Baseball. Major League Baseball: Official Baseball Rules. 2012년 2월 23일에 확인. 381 | ↑ 박동희. “SK 와이번스의 ‘야큐(野球)’ 실험”, 《스포츠 2.0》, 2007년 3월 23일 작성. 2009년 1월 1일 확인. 382 | ↑ Block (2005년), p.106~108. 383 | ↑ 야구의 역사, 조지 벡시 p. 59 384 | ↑ 야구의 역사, 조지 벡시 p.36 385 | ↑ Early Innings: A Documentary History of Baseball, 1825-1908, 설리번 p.292 386 | ↑ 쥘 티곌 (2002년). Past Time: Baseball as History. 《NINE: a Journal of Baseball History and Culture》 10: 170–171. doi:10.1353/nin.2002.0012. 2008년 6월 25일에 확인. 387 | ↑ Early Innings: A Documentary History of Baseball, 1825-1908, 설리번 p.80 388 | ↑ 야구의 역사, 조지 벡시 p. 32 389 | ↑ Early Innings: A Documentary History of Baseball, 1825-1908, 설리번 p.95 390 | ↑ “메이저리그”. 두산백과사전. 2008년 12월 14일에 읽어봄. 391 | ↑ 야구의 역사, 조지 벡시 p. 106 392 | ↑ 야구의 역사, 조지 벡시 p. 249 393 | ↑ Late Innings: A Documentary History of Baseball, 1945-1972, 설리번 p.162 394 | ↑ Late Innings: A Documentary History of Baseball, 1945-1972, 설리번 p.239 395 | ↑ 야구의 역사, 조지 벡시 p. 257 396 | ↑ “토론토 블루 제이스”. 두산백과사전. 2009년 4월 23일에 읽어봄. 397 | ↑ 가 나 국제 야구 연맹 (대륙 연맹/회원국 연맹). IBAF. 2009년 2월 3일에 확인. 398 | ↑ “They'rrre out! Baseball, softball out of Olympics”, 《NBCSports.com》, 2005년 7월 9일 작성. 399 | ↑ “IOC: Add golf, rugby to 2016 Olympics”, 《NBCSports.com》, 2009년 8월 13일 작성. 400 | ↑ 강준만 (2007). 《한국 근대사 산책4(러일전쟁에서 한국군 해산까지)》. 인물과사상사, 198쪽. ISBN 978-89-5906-074-0 “한국에 야구가 처음 들어온 것은 1905년으로, 당시 선교사로 온 미국인 질레트(P. L. Gillett)가 황성기독청년회 회원들에게 야구를 가르친 것이 그 시초이다. 1906년 2월 11일 훈련원 터에서 YMCA팀 대 덕어(독일어)학교팀 사이에 최초의 야구경기가 열렸다. 20) 『황성신문』1909년 3월 21일자엔 다음과 같은 〈야구단 운동가〉라는 노래가 소개돼 있을 정도로 야구는 큰 인기를 누렸다. "무쇠 골격 돌 근육 소년 남아야/애국의 정신을 분발하여라/다달았네 다달았네 우리나라에/소년의 활동 시대 다달았네 /(후렴) 만인 대적(對敵) 연습하여 후일 전공 세우세/절세 영웅 대사업이 우리 목적이 아닌가"21)” 401 | ↑ Thurston (2000), p. 15; Official Rules/Foreword. Major League Baseball. 2009년 2월 2일에 확인. Official Rules/1.00—Objectives of the Game (Rules 1.01–1.03). Major League Baseball. 2009년 2월 2일에 확인. Official Rules/2.00—Definitions of Terms. Major League Baseball. 2009년 2월 2일에 확인. Official Rules/4.00—Starting and Ending a Game (Rule 4.10). Major League Baseball. 2009년 2월 2일에 확인. 402 | ↑ 클레온 왈푸드 "Most 'Signs' Given by Coaches Are Merely Camouflage", Baseball Digest, 1960년 12월 ~ 1961년 1월, pp. 47–49. 403 | ↑ 허진우. “메이저리그, 오는 8월 비디오 판독제 도입 추진”, 《일간스포츠》, 2008년 6월 15일 작성. 404 | ↑ 가 나 다 하일성 (1995년 5월 1일). 《최신 야구교실》. 국일미디어, 19쪽. ISBN 978-89-7425-228-1 405 | ↑ 야구교실, 하일성 p.23 406 | ↑ 가 나 다 “전진수비”. 두산백과사전. 2010년 11월 30일에 읽어봄. 407 | ↑ 야구교실, 하일성 p.46 408 | ↑ “다운스윙”. 두산백과사전. 2010년 11월 30일에 읽어봄. 409 | ↑ 가 나 (한국어) 조해연 (2007). 《조해연의 우리말 야구용어 풀이》. 지성사, 49쪽. ISBN 8978891489 410 | ↑ 앤드류 배스트 (2008년 7월 18일). Southpaw’s Revenge. 2009년 2월 8일에 확인. 411 | ↑ 이상주. “'내 맘대로 타격' 스위치 타자의 세계”, 《스포츠서울》, 2008년 9월 26일 작성. 2009년 2월 24일 확인. 412 | ↑ 최민규. “무사 1루, 희생 번트 대지 말라”, 《스포츠 2.0》, 2006년 12월 27일 작성. 2009년 2월 24일 확인. 413 | ↑ Baseball Strategies: Your Guide to the Game Within the Game, 스탤링스, 베넷, 42–43, 47–48. 414 | ↑ Baseball Strategies: Your Guide to the Game Within the Game, 스탤링스, 베넷, p. 45. 415 | ↑ “전진수비”. 두산백과사전. 2009년 2월 24일에 읽어봄. 416 | ↑ 야구교실, 하일성 p.306 417 | ↑ 송재우. “사인, 또 하나의 야구 묘미”, 《송재우 칼럼》, 2007년 6월 1일 작성. 2009년 2월 24일 확인. 418 | ↑ “그린라이트”. 표준국어대사전. 2009년 2월 23일에 읽어봄. 419 | ↑ Cohen, Morris Raphael, "Baseball as a National Religion" (1919), in Cohen, The Faith of a Liberal (Transaction, 1993 [1946]), pp. 334–336: p. 334. 420 | ↑ 가 나 다 할 보드레이, "Baseball wants just a few more minutes", USA투데이, 2004년 2월 26일 421 | ↑ 가 나 제프 그린필드, "Midnight Baseball", 타임, 1998년 7월 13일 422 | ↑ 신인하. “경기시간 단축운동을 벌이고 있는 일본 야구계”, 《야큐 리포트》, 2008년 5월 8일 작성. 2009년 2월 26일 확인. 423 | ↑ MLB 공식 웹사이트. 424 | ↑ 가 나 문상열. “타율 〉출루율 진기록 나왔다”, 《동아일보》, 2008년 5월 16일 작성. 2008년 1월 2일 확인. 425 | ↑ “장타율”. 두산백과사전. 2009년 1월 3일에 읽어봄. 426 | ↑ 김형준. “마이리그 Tip - 타율 대비 최고 생산성의 타자는?”, 《김형준 칼럼》, 2008년 9월 3일 작성. 2009년 1월 3일 확인. 427 | ↑ 이호영. “롯데 자이언츠, 가을에도 야구한다”, 《스포츠 2.0》, 2008년 12월 16일 작성. 2009년 1월 2일 확인. 428 | ↑ 유해길. “WBC '파란 태풍' 야구 세계화 초석되다”, 《세계일보》, 2006년 3월 20일 작성. 429 | [편집] 430 | 바깥 고리 위키미디어 공용에 관련 미디어 분류가 있습니다. 431 | 야구 432 | 위키낱말사전에 이 문서와 관련된 글이 있습니다. 433 | 야구 434 | 435 | 야구 조직/리그 436 | (영어) 메이저 리그 야구 공식 홈페이지 437 | (영어) 마이너 리그 야구 공식 홈페이지 438 | (영어) 국제 야구 연맹 439 | (영어) 영국 야구 연맹 440 | (한국어) 대한 야구 협회 441 | 야구 기록 442 | (영어) 위키아 야구 443 | (영어) 베이스볼-레퍼런스 공식 홈페이지 444 | (영어) 더베이스볼큐브 공식 홈페이지 445 | (영어) 야구-연감 공식 홈페이지 446 | 야구 뉴스/그 외 447 | (영어) 초기 야구 온라인 박물관 홈페이지 448 | (영어) 스팔딩 가이드 회의 도서관 공식 홈페이지 449 | (영어) 야구 신문 기록 홈페이지 450 | (영어) 중국의 야구 451 | (영어) 온라인 야구 뉴스/잡지 452 | (영어) 야구 경기장 구조, 설계 453 | (영어) 유럽 야구 및 소프트볼 뉴스·정보[보이기] 454 | 야구와 관련된 항목 455 | 456 | 457 | 분류: 야구 458 | 둘러보기 메뉴 459 | 계정 만들기 460 | 로그인 461 | 연습장 462 | 문서 463 | 토론 464 | 읽기 465 | 편집 466 | 역사 467 | 468 | 대문 469 | 사용자 모임 470 | 요즘 화제 471 | 최근 바뀜 472 | 모든 문서 보기 473 | 임의 문서로 474 | 도움말 475 | 기부 476 | 도구모음 477 | 여기를 가리키는 문서 478 | 가리키는 글의 바뀜 479 | 공용에 올리기 480 | 특수 문서 목록 481 | 고유링크 482 | 문서 정보 483 | 이 문서 인용하기 484 | 인쇄/내보내기 485 | 다른 언어 486 | 487 | 이 문서는 2013년 1월 9일 (수) 14:40에 마지막으로 바뀌었습니다. 488 | 모든 문서는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0에 따라 사용할 수 있습니다. 추가적인 조건이 적용될 수 있습니다. 자세한 내용은 이용 규약을 참고하십시오. 489 | Wikipedia®는 미국 및 다른 국가에 등록되어 있는, Wikimedia Foundation, Inc. 소유의 등록 상표입니다. 490 | 개인정보 정책 491 | 위키백과 소개 492 | 면책 조항 493 | 모바일판에서 보기 -------------------------------------------------------------------------------- /cabal.project.coveralls: -------------------------------------------------------------------------------- 1 | packages: . 2 | 3 | source-repository-package 4 | type: git 5 | location: https://github.com/composewell/hpc-coveralls 6 | tag: d9e20179579f0638f6e978816355d18568e6a1f0 7 | -------------------------------------------------------------------------------- /download-ucd-files.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # When reproducing the Haskell files we want to to be sure that the files that 4 | # we used to generate them earlier are exactly the same as the ones we are 5 | # downloading. To ensure that verfication of the checksum is necessary. 6 | 7 | VERSION=14.0.0 8 | 9 | SRC_FILE="https://www.unicode.org/Public/$VERSION/ucd/NormalizationTest.txt" 10 | DST_FILE="test/data/NormalizationTest.txt" 11 | SRC_FILE_CKSUM="7cb30cc2abe6c29c292b99095865d379ce1213045c78c4ff59c7e9391bbe2331" 12 | 13 | 14 | # Download the file 15 | wget -O "$DST_FILE" "$SRC_FILE" 16 | 17 | # Verify checksum 18 | DST_FILE_CKSUM=$(sha256sum $DST_FILE | cut -f1 -d' ') 19 | if test "$DST_FILE_CKSUM" != "$SRC_FILE_CKSUM" 20 | then 21 | echo "sha256sum of the downloaded file $DST_FILE " 22 | echo " [$DST_FILE_CKSUM] does not match the expected checksum [$SRC_FILE_CKSUM]" 23 | exit 1 24 | else 25 | echo "$DST_FILE checksum ok" 26 | fi 27 | 28 | # Export the version so it can be used by the executable 29 | export UNICODE_VERSION="$VERSION" 30 | -------------------------------------------------------------------------------- /stack.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - '.' 3 | resolver: lts-18.18 4 | extra-deps: 5 | - unicode-data-0.2.0 6 | - tasty-bench-0.3 7 | 8 | # Look at https://stackoverflow.com/questions/70045586/could-not-find-module-system-console-mintty-win32-when-compiling-test-framework 9 | flags: 10 | mintty: 11 | Win32-2-13-1: false 12 | -------------------------------------------------------------------------------- /test/Extra.hs: -------------------------------------------------------------------------------- 1 | module Main (main) where 2 | 3 | import Data.Text.Normalize (NormalizationMode(NFD)) 4 | import QuickCheckUtils () 5 | import Test.QuickCheck (quickCheck) 6 | 7 | -- Misc, trivial, boundary test cases 8 | 9 | t_eq :: NormalizationMode -> Bool 10 | t_eq mode = mode == NFD || mode /= NFD 11 | 12 | t_enum :: NormalizationMode -> Bool 13 | t_enum mode = mode == toEnum (fromEnum mode) 14 | && if (fromEnum mode == 0) 15 | then length (enumFromThen mode (succ mode)) /= 0 16 | else succ (pred mode) == mode 17 | && length (enumFrom mode) /= 0 18 | 19 | t_show :: NormalizationMode -> Bool 20 | t_show mode = 21 | not (null (showsPrec 0 mode "x")) 22 | && not (null (show mode)) 23 | && not (null (showList [mode] "x")) 24 | 25 | 26 | main :: IO () 27 | main = do 28 | -- test "NormalizationMode" instances 29 | quickCheck t_eq 30 | quickCheck t_enum 31 | quickCheck t_show 32 | -------------------------------------------------------------------------------- /test/NormalizationTest.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP #-} 2 | {-# LANGUAGE OverloadedStrings #-} 3 | {-# LANGUAGE TupleSections #-} 4 | 5 | -- | 6 | -- Copyright : (c) 2016 Harendra Kumar 7 | -- 8 | -- License : BSD-3-Clause 9 | -- Maintainer : harendra.kumar@gmail.com 10 | -- Stability : experimental 11 | -- Portability : GHC 12 | -- 13 | 14 | import Control.Monad (when) 15 | import qualified Data.ByteString as B 16 | import Data.Char (chr, isSpace, ord, toUpper) 17 | #if MIN_VERSION_base(4,8,0) 18 | import Data.Function ((&)) 19 | #endif 20 | import Data.List (intercalate, isPrefixOf) 21 | import Data.List.Split (splitOn) 22 | import Data.Text (Text) 23 | import qualified Data.Text as T 24 | import qualified Data.Text.Encoding as T 25 | import Data.Text.Normalize (NormalizationMode(NFD, NFKD, NFC, NFKC), normalize) 26 | import Text.Printf (printf) 27 | 28 | #if !MIN_VERSION_base(4,8,0) 29 | (&) :: a -> (a -> b) -> b 30 | x & f = f x 31 | #endif 32 | 33 | chrToHex :: Char -> [Char] 34 | chrToHex = (map toUpper) . (printf "%.4x") . ord 35 | 36 | strToHex :: [Char] -> String 37 | strToHex = unwords . (map chrToHex) 38 | 39 | checkEqual :: String -> (Text -> Text) -> (Text, Text) -> IO Bool 40 | checkEqual opName op (c1, c2) = 41 | if c1 /= op c2 then do 42 | putStrLn $ opName ++ " " ++ txtToHex c2 43 | ++ " = " ++ txtToHex (op c2) 44 | ++ "; Expected: " ++ txtToHex c1 45 | return False 46 | else return True 47 | where 48 | txtToHex = strToHex . T.unpack 49 | 50 | checkOp :: String -> NormalizationMode -> [(Text, Text)] -> IO Bool 51 | checkOp name op pairs = do 52 | res <- mapM (checkEqual name ((normalize op))) pairs 53 | return $ all (== True) res 54 | 55 | checkNFC :: (Text, Text, Text, Text, Text) -> IO Bool 56 | checkNFC (c1, c2, c3, c4, c5) = 57 | checkOp "toNFC" NFC $ 58 | concat [ map (c2,) [c1, c2, c3] 59 | , map (c4,) [c4, c5] 60 | ] 61 | 62 | checkNFD :: (Text, Text, Text, Text, Text) -> IO Bool 63 | checkNFD (c1, c2, c3, c4, c5) = 64 | checkOp "toNFD" NFD $ 65 | concat [ map (c3,) [c1, c2, c3] 66 | , map (c5,) [c4, c5] 67 | ] 68 | 69 | checkNFKC :: (Text, Text, Text, Text, Text) -> IO Bool 70 | checkNFKC (c1, c2, c3, c4, c5) = 71 | checkOp "toNFKC" NFKC $ map (c4,) [c1, c2, c3, c4, c5] 72 | 73 | checkNFKD :: (Text, Text, Text, Text, Text) -> IO Bool 74 | checkNFKD (c1, c2, c3, c4, c5) = 75 | checkOp "toNFKD" NFKD $ map (c5,) [c1, c2, c3, c4, c5] 76 | 77 | checkAllTestCases :: Int -> String -> IO () 78 | checkAllTestCases lineno line = do 79 | case splitOn ";" line of 80 | c1 : c2 : c3 : c4 : c5 : _ -> do 81 | let cps = map cpToText [c1, c2, c3, c4, c5] 82 | mapM_ (checkOneTestCase cps) 83 | [checkNFD, checkNFKD, checkNFC, checkNFKC] 84 | _ -> error $ "Unrecognized line: " ++ line 85 | where 86 | cpToText xs = T.pack $ map (chr . read . ("0x" ++)) (words xs) 87 | 88 | checkOneTestCase cps f = do 89 | res <- f (tuplify cps) 90 | when (not res) $ do 91 | putStrLn ("Failed at line: " ++ show lineno) 92 | putStrLn line 93 | putStrLn $ codes ++ "; # (" ++ txt 94 | error "Bailing out" 95 | where 96 | strs = map T.unpack cps 97 | codes = intercalate ";" $ map strToHex strs 98 | txt = intercalate "; " (map T.unpack cps) 99 | 100 | tuplify [c1, c2, c3, c4, c5] = (c1, c2, c3, c4, c5) 101 | tuplify _ = error "tuplify bad arguments" 102 | 103 | checkLine :: (Int, String) -> IO () 104 | checkLine (lineno, line) = do 105 | -- marker lines indicating a test block start with @ 106 | if "@" `isPrefixOf` line 107 | then 108 | putStrLn line 109 | else 110 | checkAllTestCases lineno line 111 | 112 | testNormalize :: FilePath -> IO () 113 | testNormalize file = do 114 | contents <- T.unpack . T.decodeUtf8 <$> B.readFile file 115 | let ls = lines contents -- split into lines 116 | & map (dropWhile isSpace) -- trim leading spaces 117 | & zip [1..] -- add numbering 118 | & filter ((/= []) . snd) -- remove blank lines 119 | & filter (not . ("#" `isPrefixOf`) . snd) -- remove comments 120 | checkAll ls 121 | where 122 | checkAll (x:xs) = checkLine x >> checkAll xs 123 | checkAll [] = return () 124 | 125 | main :: IO () 126 | main = do 127 | testNormalize "test/data/NormalizationTest.txt" 128 | -- Additional test cases not in the unicode standard suite 129 | testNormalize "test/data/extra/NormalizationTest.txt" 130 | -------------------------------------------------------------------------------- /test/Properties.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP #-} 2 | {-# LANGUAGE OverloadedStrings #-} 3 | {-# LANGUAGE ScopedTypeVariables #-} 4 | 5 | module Main (main) where 6 | 7 | import Data.Text (Text) 8 | import qualified Data.Text.Normalize as T 9 | import Data.Text.Normalize (NormalizationMode) 10 | import QuickCheckUtils () 11 | import Test.Hspec.QuickCheck (modifyMaxSuccess, prop) 12 | import Test.Hspec as H 13 | import Test.QuickCheck (NonNegative(..)) 14 | import Unicode.Internal.Division (quotRem21, quotRem28) 15 | 16 | #ifdef HAS_ICU 17 | import Data.Text (pack) 18 | 19 | #if MIN_VERSION_text_icu(0,8,0) 20 | import qualified Data.Text.ICU.Normalize2 as ICU 21 | #else 22 | import qualified Data.Text.ICU.Normalize as ICU 23 | #endif 24 | 25 | toICUMode :: NormalizationMode -> ICU.NormalizationMode 26 | toICUMode mode = 27 | case mode of 28 | T.NFD -> ICU.NFD 29 | T.NFKD -> ICU.NFKD 30 | T.NFC -> ICU.NFC 31 | T.NFKC -> ICU.NFKC 32 | 33 | t_normalizeCompareICU :: NormalizationMode -> Text -> Bool 34 | t_normalizeCompareICU mode t = 35 | T.normalize mode t == ICU.normalize (toICUMode mode) t 36 | 37 | #else 38 | import qualified Data.Text as T 39 | 40 | -- WARNING! These tests do not check the correctness of the output they 41 | -- only check whether a non empty output is produced. 42 | 43 | t_nonEmpty :: (Text -> Text) -> Text -> Bool 44 | t_nonEmpty f t 45 | | T.null t = T.null ft 46 | | otherwise = T.length ft > 0 47 | where ft = f t 48 | 49 | -- Normalization 50 | 51 | t_normalize :: NormalizationMode -> Text -> Bool 52 | t_normalize mode = t_nonEmpty $ T.normalize mode 53 | #endif 54 | 55 | main :: IO () 56 | main = 57 | hspec 58 | $ H.parallel 59 | $ modifyMaxSuccess (const 10000) 60 | $ do 61 | prop "quotRem28" $ \(NonNegative n) -> n `quotRem` 28 == quotRem28 n 62 | prop "quotRem28 maxBound" $ \(NonNegative n) -> 63 | let n1 = maxBound - n 64 | in n1 `quotRem` 28 == quotRem28 n1 65 | prop "quotRem21" $ \(NonNegative n) -> n `quotRem` 21 == quotRem21 n 66 | prop "quotRem21 maxBound" $ \(NonNegative n) -> 67 | let n1 = maxBound - n 68 | in n1 `quotRem` 21 == quotRem21 n1 69 | #ifdef HAS_ICU 70 | it "Compare \127340 with ICU" $ 71 | t_normalizeCompareICU T.NFKD (pack "\127340") `H.shouldBe` True 72 | prop "Comparing random strings with ICU..." t_normalizeCompareICU 73 | #else 74 | prop "Checking non-empty results for random strings..." t_normalize 75 | #endif 76 | -------------------------------------------------------------------------------- /test/QuickCheckUtils.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE BangPatterns #-} 2 | {-# OPTIONS_GHC -fno-warn-orphans #-} 3 | 4 | module QuickCheckUtils () where 5 | 6 | import qualified Data.Text as T 7 | import Data.Text.Normalize (NormalizationMode(NFD, NFKD, NFC, NFKC)) 8 | import Test.QuickCheck (Arbitrary(arbitrary, shrink), elements) 9 | 10 | instance Arbitrary T.Text where 11 | arbitrary = T.pack `fmap` arbitrary 12 | shrink = map T.pack . shrink . T.unpack 13 | 14 | instance Arbitrary NormalizationMode where 15 | arbitrary = elements [NFD, NFKD, NFC, NFKC] 16 | -------------------------------------------------------------------------------- /test/data/extra/NormalizationTest.txt: -------------------------------------------------------------------------------- 1 | # Columns (c1, c2,...) are separated by semicolons 2 | # They have the following meaning: 3 | # source; NFC; NFD; NFKC; NFKD 4 | 5 | @Extra test cases not in the unicode standard test suite 6 | AC00 11A7;AC00 11A7;1100 1161 11A7;AC00 11A7;1100 1161 11A7; # 11A7 is not a valid T and should not be combined with LV AC00 to give AC00 as NFC. 7 | AC00 11A8;AC01;1100 1161 11A8;AC01;1100 1161 11A8; # Combine precomposed LV and a T i.e sequence. 8 | 1100 11A8;1100 11A8;1100 11A8;1100 11A8;1100 11A8; # Invalid sequence 9 | 2FA1E;2FA1E;2FA1E;2FA1E;2FA1E; # Beyond decomposable max 10 | -------------------------------------------------------------------------------- /unicode-transforms.cabal: -------------------------------------------------------------------------------- 1 | cabal-version: 2.2 2 | 3 | name: unicode-transforms 4 | version: 0.4.0.1 5 | synopsis: Unicode normalization 6 | description: Fast Unicode 14.0.0 normalization in Haskell (NFC, NFKC, NFD, NFKD). 7 | category: Data,Text,Unicode 8 | stability: Experimental 9 | homepage: http://github.com/composewell/unicode-transforms 10 | bug-reports: https://github.com/composewell/unicode-transforms/issues 11 | author: Harendra Kumar 12 | maintainer: harendra.kumar@gmail.com 13 | copyright: 2016-2017 Harendra Kumar, 14 | 2014–2015 Antonio Nikishaev 15 | license: BSD-3-Clause 16 | license-file: LICENSE 17 | tested-with: GHC==8.0.2 18 | , GHC==8.2.2 19 | , GHC==8.4.4 20 | , GHC==8.6.5 21 | , GHC==8.8.4 22 | , GHC==8.10.7 23 | , GHC==9.0.2 24 | , GHC==9.2.8 25 | , GHC==9.4.7 26 | , GHC==9.6.3 27 | , GHC==9.8.1 28 | , GHC==9.10.1 29 | build-type: Simple 30 | extra-doc-files: 31 | Changelog.md 32 | MAINTAINING.md 33 | NOTES.md 34 | README.md 35 | benchmark/README.md 36 | extra-source-files: 37 | download-ucd-files.sh 38 | benchmark/NormalizeFile.hs 39 | benchmark/data/AllChars.txt 40 | benchmark/data/Deutsch.txt 41 | benchmark/data/Devanagari.txt 42 | benchmark/data/English.txt 43 | benchmark/data/Japanese.txt 44 | benchmark/data/Korean.txt 45 | benchmark/data/Vietnamese.txt 46 | test/data/NormalizationTest.txt 47 | test/data/extra/NormalizationTest.txt 48 | 49 | source-repository head 50 | type: git 51 | location: https://github.com/composewell/unicode-transforms 52 | 53 | flag dev 54 | description: Developer build 55 | manual: True 56 | default: False 57 | 58 | flag bench-show 59 | description: Use bench-show to compare benchmarks 60 | manual: True 61 | default: False 62 | 63 | flag has-icu 64 | description: Use text-icu for benchmark and test comparisons 65 | manual: True 66 | default: False 67 | 68 | flag has-llvm 69 | description: Use llvm backend (faster) for compilation 70 | manual: True 71 | default: False 72 | 73 | flag use-gauge 74 | description: Use gauge instead of tasty-bench for benchmarking 75 | manual: True 76 | default: False 77 | 78 | library 79 | exposed-modules: 80 | Data.Unicode.Types 81 | Data.Text.Normalize 82 | 83 | -- Deprecated 84 | Data.ByteString.UTF8.Normalize 85 | other-modules: 86 | Data.Unicode.Internal.NormalizeStream 87 | hs-source-dirs: . 88 | ghc-options: -Wall -fwarn-identities -fwarn-incomplete-record-updates -fwarn-incomplete-uni-patterns -fwarn-tabs 89 | build-depends: 90 | base >= 4.8 && < 4.22 91 | , unicode-data >= 0.2 && < 0.7 92 | , bytestring >= 0.9 && < 0.13 93 | , ghc-prim >= 0.2 && < 0.14 94 | 95 | -- We depend on a lot of internal modules in text. We keep the upper bound 96 | -- inclusive of the latest stable version. 97 | , text >=1.1.1 && <=1.2.5.0 || >=2.0 && <2.2 98 | if flag(dev) 99 | ghc-options: -O0 100 | else 101 | ghc-options: -O2 -funbox-strict-fields -fspec-constr-count=10 102 | if flag(has-llvm) 103 | ghc-options: -fllvm 104 | default-language: Haskell2010 105 | 106 | test-suite extras 107 | type: exitcode-stdio-1.0 108 | main-is: Extra.hs 109 | other-modules: 110 | QuickCheckUtils 111 | hs-source-dirs: 112 | test 113 | ghc-options: -Wall -fwarn-identities -fwarn-incomplete-record-updates -fwarn-incomplete-uni-patterns -fwarn-tabs 114 | build-depends: 115 | QuickCheck >=2.1 && <2.16 116 | , base 117 | , deepseq >=1.1 && <1.6 118 | , text 119 | , unicode-transforms 120 | if flag(dev) 121 | ghc-options: -O0 122 | else 123 | ghc-options: -O2 -funbox-strict-fields 124 | if flag(has-llvm) 125 | ghc-options: -fllvm 126 | default-language: Haskell2010 127 | 128 | test-suite quickcheck 129 | type: exitcode-stdio-1.0 130 | main-is: Properties.hs 131 | other-modules: 132 | QuickCheckUtils 133 | hs-source-dirs: 134 | test 135 | ghc-options: -Wall -fwarn-identities -fwarn-incomplete-record-updates -fwarn-incomplete-uni-patterns -fwarn-tabs 136 | build-depends: 137 | QuickCheck 138 | , unicode-data 139 | , base 140 | , deepseq 141 | , hspec >= 2.0 && < 3 142 | , text 143 | , unicode-transforms 144 | if flag(dev) 145 | ghc-options: -O0 146 | else 147 | ghc-options: -O2 -funbox-strict-fields 148 | if flag(has-llvm) 149 | ghc-options: -fllvm 150 | if flag(has-icu) 151 | cpp-options: -DHAS_ICU 152 | build-depends: 153 | text-icu >=0.6.2.1 && <0.9 154 | default-language: Haskell2010 155 | 156 | test-suite ucd 157 | type: exitcode-stdio-1.0 158 | main-is: NormalizationTest.hs 159 | hs-source-dirs: 160 | test 161 | ghc-options: -Wall -fwarn-identities -fwarn-incomplete-record-updates -fwarn-incomplete-uni-patterns -fwarn-tabs 162 | build-depends: 163 | base 164 | , bytestring 165 | , split >=0.2 && <0.3 166 | , text 167 | , unicode-transforms 168 | if flag(dev) 169 | ghc-options: -O0 170 | else 171 | ghc-options: -O2 -funbox-strict-fields 172 | if flag(has-llvm) 173 | ghc-options: -fllvm 174 | default-language: Haskell2010 175 | 176 | benchmark bench 177 | type: exitcode-stdio-1.0 178 | main-is: Benchmark.hs 179 | hs-source-dirs: 180 | benchmark 181 | ghc-options: -Wall -fwarn-identities -fwarn-incomplete-record-updates -fwarn-incomplete-uni-patterns -fwarn-tabs 182 | build-depends: 183 | base 184 | , deepseq 185 | , filepath >=1.0 && <2 186 | , path >=0.0.0 && <0.10 187 | , path-io >=0.1.0 && <1.9 188 | , text 189 | , unicode-transforms 190 | if flag(use-gauge) 191 | build-depends: gauge >=0.2.0 && <0.3 192 | else 193 | build-depends: tasty-bench>= 0.2.5 && <0.5 194 | mixins: tasty-bench (Test.Tasty.Bench as Gauge.Main) 195 | if flag(dev) 196 | ghc-options: -O0 197 | else 198 | ghc-options: -O2 -funbox-strict-fields 199 | if flag(has-llvm) 200 | ghc-options: -fllvm 201 | if flag(has-icu) 202 | cpp-options: -DBENCH_ICU 203 | build-depends: 204 | text-icu 205 | if impl(ghc < 7.10) 206 | build-depends: 207 | path (<0.5.12 || >0.5.12) 208 | default-language: Haskell2010 209 | 210 | executable chart 211 | default-language: Haskell2010 212 | hs-source-dirs: benchmark 213 | main-is: Chart.hs 214 | if flag(bench-show) 215 | buildable: True 216 | build-Depends: 217 | base 218 | , bench-show >= 0.3 && < 0.4 219 | , split 220 | , transformers >= 0.4 && < 0.7 221 | else 222 | buildable: False 223 | --------------------------------------------------------------------------------