utf8←{⎕IO ⎕ML←0 1                           ⍝ UTF-8 ←→ ⎕AV translation.

    utab←{                                  ⍝ 256-item encoding vector.
        ⍵<128:⍵                             ⍝ 0000 .. 007f
        ⍵<2048:192 128+0 64⊤⍵               ⍝ 0080 .. 07ff
        224 128 128+0 64 64⊤⍵               ⍝ 0800 .. ffff
    }¨∘{                                    ⍝ Unicode codepoints / ⎕AV char.
        16⊥'0123456789abcdef'⍳⍉⍵            ⍝ hex to decimal.
    }∘{                                     ⍝
        ↑(1↓¨(' '=⍵)⊂⍵)~⊂''                 ⍝ 256×4 char matrix.
    }∘{
        ' 0000 0008 000a 000d 0020 000c e000 e001 ',⍵}∘{    ⍝ 00-07  ········
        ' 001b 0009 2336 026b 0025 0027 237a 2375 ',⍵}∘{    ⍝ 08-0f  ··⌶ɫ%'⍺⍵
        ' 005f 0061 0062 0063 0064 0065 0066 0067 ',⍵}∘{    ⍝ 10-17  _abcdefg
        ' 0068 0069 006a 006b 006c 006d 006e 006f ',⍵}∘{    ⍝ 18-1f  hijklmno
        ' 0070 0071 0072 0073 0074 0075 0076 0077 ',⍵}∘{    ⍝ 20-27  pqrstuvw
        ' 0078 0079 007a e002 e003 00af 002e 236c ',⍵}∘{    ⍝ 28-2f  xyz¯.⍬
        ' 0030 0031 0032 0033 0034 0035 0036 0037 ',⍵}∘{    ⍝ 30-37  01234567
        ' 0038 0039 e004 00a4 00a5 0024 00a3 00a2 ',⍵}∘{    ⍝ 38-3f  89⊢¥$£¢
        ' 2206 0041 0042 0043 0044 0045 0046 0047 ',⍵}∘{    ⍝ 40-47  ∆ABCDEFG
        ' 0048 0049 004a 004b 004c 004d 004e 004f ',⍵}∘{    ⍝ 48-4f  HIJKLMNO
        ' 0050 0051 0052 0053 0054 0055 0056 0057 ',⍵}∘{    ⍝ 50-57  PQRSTUVW
        ' 0058 0059 005a e005 e006 00fd 00b7 e007 ',⍵}∘{    ⍝ 58-5f  XYZý·
        ' 2359 00c1 00c2 00c3 00c7 00c8 00ca 00cb ',⍵}∘{    ⍝ 60-67  ⍙ÁÂÃÇÈÊË
        ' 00cc 00cd 00ce 00cf 00d0 00d2 00d3 00d4 ',⍵}∘{    ⍝ 68-6f  ÌÍÎÏÐÒÓÔ
        ' 00d5 00d9 00da 00db 00dd 00fe 00e3 00ec ',⍵}∘{    ⍝ 70-77  ÕÙÚÛÝþãì
        ' 00f0 00f2 00f5 007b 22a2 007d 22a3 2337 ',⍵}∘{    ⍝ 78-7f  ðòõ{⊢}⊣⌷
        ' 00a8 00c0 00c4 00c5 00c6 2368 00c9 00d1 ',⍵}∘{    ⍝ 80-87  ¨ÀÄÅÆ⍨ÉÑ
        ' 00d6 00d8 00dc 00df 00e0 00e1 00e2 00e4 ',⍵}∘{    ⍝ 88-8f  ÖØÜßàáâä
        ' 00e5 00e6 00e7 00e8 00e9 00ea 00eb 00ed ',⍵}∘{    ⍝ 90-97  åæçèéêëí
        ' 00ee 00ef 00f1 005b 002f 233f 005c 2340 ',⍵}∘{    ⍝ 98-9f  îïñ[/⌿\⍀
        ' 003c 2264 003d 2265 003e 2260 2228 005e ',⍵}∘{    ⍝ a0-a7  <≤=≥>≠∨^
        ' 002d 002b 00f7 00d7 003f 220a 2374 007e ',⍵}∘{    ⍝ a8-af  -+÷×?∊⍴~
        ' 2191 2193 2373 25cb 002a 2308 230a 2207 ',⍵}∘{    ⍝ b0-b7  ↑↓⍳○*⌈⌊∇
        ' 2218 0028 2282 2283 2229 222a 22a5 22a4 ',⍵}∘{    ⍝ b8-bf  ∘(⊂⊃∩∪⊥⊤
        ' 007c 003b 002c 2371 2372 2352 234b 2349 ',⍵}∘{    ⍝ c0-c7  |;,⍱⍲⍒⍋⍉
        ' 233d 2296 235f 2339 0021 2355 234e 236b ',⍵}∘{    ⍝ c8-cf  ⌽⊖⍟⌹!⍕⍎⍫
        ' 236a 2261 2262 00f3 00f4 00f6 00f8 0022 ',⍵}∘{    ⍝ d0-d7  ⍪≡≢óôöø"
        ' 0023 e008 0026 2019 2518 2510 250c 2514 ',⍵}∘{    ⍝ d8-df  #&’┘┐┌└
        ' 253c 2500 251c 2524 2534 252c 2502 0040 ',⍵}∘{    ⍝ e0-e7  ┼─├┤┴┬│@
        ' 00f9 00fa 00fb 2227 00fc 2018 2223 00b6 ',⍵}∘{    ⍝ e8-ef  ùúû∧ü‘∣¶
        ' 003a 2377 00bf 00a1 22c4 2190 2192 235d ',⍵}∘{    ⍝ f0-f7  :⍷¿¡⋄←→⍝
        ' 0029 005d e009 e00a 00a7 2395 235e 2363 ',⍵}∘{    ⍝ f8-ff  )]§⎕⍞⍣
    ''}

    ⍺←utab''                                ⍝ monadic, build table.
    0=⍴⍺:utab''                             ⍝ null ⍺: return table.
    ^/⍵∊⎕AV:∊⍺[⎕AV⍳⍵]                       ⍝ all ⍵ in ⎕AV: UTF-8.
    3≠10|⎕DR ⍵:⎕SIGNAL 11                   ⍝ not simple int: error.
    seqs←¯1+↑257|1+⍺∘⍳¨1 2 3,/¨⊂⍵           ⍝ sequences per sequence length.
    ⎕AV[+⌿0⌈(∨⌿¯1≠seqs)/seqs]               ⍝ ⍵ is UTF-8: ⎕AV.
}

test script

Back to: notes

Back to: Workspaces

Trouble seeing APL font?