cp1125-IBM
248-Ї 249-ї 250-÷ 251-± 252-№ 253-¤ 254-■ 255-NBSP
cp1125-iconv
248-Ї 249-ї 250-· 251-√ 252-№ 253-¤ 254-■ 255-NBSP
cp1125-keyrus
248-Ї 249-ї 250-· 251-√ 252-№ 253-Σ 254-■ 255-§
C:\Users\py\Desktop\try\ebcdic>chcp 21025
Active code page: 21025
C:\Users\py\Desktop\try\ebcdic>echo public class try1123{public static void main(String argv[]){System.out.println("Привіт, EBCDIC-1123!");}}>try1123.java
C:\Users\py\Desktop\try\ebcdic>javac -encoding cp1123 try1123.java
C:\Users\py\Desktop\try\ebcdic>java try1123
М0YSш2��єђѓёјѓ ��␈��
C:\Users\py\Desktop\try\ebcdic>chcp 1251
Active code page: 1251
C:\Users\py\Desktop\try\ebcdic>java try1123
Привіт, EBCDIC-1123!
(Кодування початкового коду та кодування вводу-виводу — різні речі, тому java тут виводить текст у кодуванні за замовчуванням — cp1251).C:\Users\py\Desktop\try\ebcdic>chcp 866
Active code page: 866
C:\Users\py\Desktop\try\ebcdic>echo # encoding=cp500>try500.py
C:\Users\py\Desktop\try\ebcdic>chcp 500
Active code page: 500
C:\Users\py\Desktop\try\ebcdic>echo.>>try500.py
C:\Users\py\Desktop\try\ebcdic>echo print('Hello, EBCDIC-500!')>>try500.py
C:\Users\py\Desktop\try\ebcdic>py -3 try500.py
Hello, EBCDIC-500!
C:\Users\py\Desktop\try\ebcdic>py -3 -m try500
Traceback (most recent call last):
File "C:\Users\py\AppData\Local\Programs\Python\Python38-32\lib\runpy.py", line 185, in _run_module_as_main
mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
File "C:\Users\py\AppData\Local\Programs\Python\Python38-32\lib\runpy.py", line 155, in _get_module_details
code = loader.get_code(mod_name)
File "<frozen importlib._bootstrap_external>", line 916, in get_code
File "<frozen importlib._bootstrap_external>", line 846, in source_to_code
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "C:\Users\py\Desktop\try\ebcdic\try500.py", line 1
��Á>Ä?ÀÑ>Å
Äø�����
^
SyntaxError: invalid character in identifier
Якщо пітонівська програма запускається як скрипт, і в першому чи другому рядку вказується її кодування, то читання в цьому кодуванні починається після цього спеціального коментаря, тому цієї помилки не виникає. Але якщо це модуль, то читання в новому кодуванні починається від початку файлу — в ньому ж повторно перечитується цей керуючий коментар, записаний в EBCDIC-несумісному кодуванні, тому виникає помилка. Проблему можна обійти, створивши спеціалізований кодек для початкового коду в мішаному кодуванні. Від стандартного cp500 він відрізнятиметься лише тим, що байти, які кодують '#' та '\n' в ASCII, кодуватимуть ці ж символи і в ньому (дублюючи EBCDIC-коди для них, що використовуватимуться в решті коду). Тоді ascii-коментарі лишатимуться коментарями, тому таке кодування можна використовувати і в модулях.
def bytelen(firstbyte):
'''UTF-8 char len by first byte
No check if this byte valid, any byte, that does not begin multibyte sequence, gives length 1'''
if firstbyte<0xC0:
return 1
elif firstbyte<0xE0:
return 2
elif firstbyte<0xF0:
return 3
elif firstbyte<0xF8:
return 4
elif firstbyte<0xFC:
return 5
elif firstbyte<0xFE:
return 6
else:
return 7
def byteval(b):
'''Value of start or continuation byte'''
if b<0xA0:
return -1
elif b<0xC0:
return b&31
elif b<0xE0:
return b&31
elif b<0xF0:
return b&15
elif b<0xF8:
return b&7
elif b<0xFC:
return b&3
elif b<0xFE:
return b&1
else:return -1
def charminlen(cc):
if cc<=0x9F: return 1
if cc<=0x3FF: return 2
if cc<=0x3FFF: return 3
if cc<=0x3FFFF: return 4
else: return 5
def str2i8(s):
res=bytearray()
'''if cesu:
bs=s.encode('utf-16le')
codes=[bs[i]|(bs[i+1]<<8) for i in range(0, len(bs), 2)]
else:'''
codes=map(ord, s)
for c in codes:
# clen=max(minlen, charminlen(c))-1
clen=charminlen(c)-1
l=len(res)
for _ in range(clen):
res.insert(l, 160|(c&31))
c>>=5
res.insert(l, c|[0, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC][clen]) #, 0xFE, 0xFF (?)
return bytes(res)
i2e=bytes(int(i,16) for i in '''
00 01 02 03 37 2D 2E 2F 16 05 15 0B 0C 0D 0E 0F
10 11 12 13 3C 3D 32 26 18 19 3F 27 1C 1D 1E 1F
40 5A 7F 7B 5B 6C 50 7D 4D 5D 5C 4E 6B 60 4B 61
F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 7A 5E 4C 7E 6E 6F
7C C1 C2 C3 C4 C5 C6 C7 C8 C9 D1 D2 D3 D4 D5 D6
D7 D8 D9 E2 E3 E4 E5 E6 E7 E8 E9 AD E0 BD 5F 6D
79 81 82 83 84 85 86 87 88 89 91 92 93 94 95 96
97 98 99 A2 A3 A4 A5 A6 A7 A8 A9 C0 4F D0 A1 07
20 21 22 23 24 25 06 17 28 29 2A 2B 2C 09 0A 1B
30 31 1A 33 34 35 36 08 38 39 3A 3B 04 14 3E FF
41 42 43 44 45 46 47 48 49 4A 51 52 53 54 55 56
57 58 59 62 63 64 65 66 67 68 69 6A 70 71 72 73
74 75 76 77 78 80 8A 8B 8C 8D 8E 8F 90 9A 9B 9C
9D 9E 9F A0 AA AB AC AE AF B0 B1 B2 B3 B4 B5 B6
B7 B8 B9 BA BB BC BE BF CA CB CC CD CE CF DA DB
DC DD DE DF E1 EA EB EC ED EE EF FA FB FC FD FE
'''.split())
def i8toebcdic(bs):
return bs.translate(i2e)
e2i=bytes(int(i,16) for i in '''
00 01 02 03 9C 09 86 7F 97 8D 8E 0B 0C 0D 0E 0F
10 11 12 13 9D 0A 08 87 18 19 92 8F 1C 1D 1E 1F
80 81 82 83 84 85 17 1B 88 89 8A 8B 8C 05 06 07
90 91 16 93 94 95 96 04 98 99 9A 9B 14 15 9E 1A
20 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 2E 3C 28 2B 7C
26 AA AB AC AD AE AF B0 B1 B2 21 24 2A 29 3B 5E
2D 2F B3 B4 B5 B6 B7 B8 B9 BA BB 2C 25 5F 3E 3F
BC BD BE BF C0 C1 C2 C3 C4 60 3A 23 40 27 3D 22
C5 61 62 63 64 65 66 67 68 69 C6 C7 C8 C9 CA CB
CC 6A 6B 6C 6D 6E 6F 70 71 72 CD CE CF D0 D1 D2
D3 7E 73 74 75 76 77 78 79 7A D4 D5 D6 5B D7 D8
D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 5D E6 E7
7B 41 42 43 44 45 46 47 48 49 E8 E9 EA EB EC ED
7D 4A 4B 4C 4D 4E 4F 50 51 52 EE EF F0 F1 F2 F3
5C F4 53 54 55 56 57 58 59 5A F5 F6 F7 F8 F9 FA
30 31 32 33 34 35 36 37 38 39 FB FC FD FE FF 9F
'''.split())
def ebcdic2i8(bs):
return bs.translate(e2i)
def i8tostr(bs):
res=[]
half=0
i=0
while i<len(bs):
chl=bytelen(bs[i])
if chl==1:
#if it is not basic ascii, do smth, else just append it:
assert bs[i]<128
res.append((bs[i]))
else:
c=0
for b in bs[i:i+chl]:
c<<=5
c|=byteval(b)
res.append((c))
#check if res[-1] is utf16 surrogate (0xD800...0xDFFF):
#(or convert via utf-16 instead, this should join surrogates automatically....)
if half:
#res[-2:] must be surrogate pair, then join them
assert 0xDC00<=res[-1]<=0xDFFF # and 0xD800<=res[-2]<=0xDBFF
#print(f'test: {res[-2:]=}')
res[-2]=((res[-2]&1023)<<10) | res[-1]&1023 | 0x10000; res.pop()
#print(f'test: {res[-1]=}')
half=0
else:
#if res[-1] is surrogate then
if 0xD800<=res[-1]<=0xDBFF:
half=1
i+=chl
return ''.join(map(chr,res))
def encode(s):
return i8toebcdic(str2i8(s))
def decode(bs):
return i8tostr(ebcdic2i8(bs))
32- 33-! 34-" 35-# 36-$ 37-% 38-& 39-'
40-( 41-) 42-* 43-+ 44-, 45-- 46-. 47-/
48-0 49-1 50-2 51-3 52-4 53-5 54-6 55-7
56-8 57-9 58-: 59-; 60-< 61-= 62-> 63-?
64-@ 65-A 66-B 67-C 68-D 69-E 70-F 71-G
72-H 73-I 74-J 75-K 76-L 77-M 78-N 79-O
80-P 81-Q 82-R 83-S 84-T 85-U 86-V 87-W
88-X 89-Y 90-Z 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-�
Цитата: Upliner от июля 10, 2023, 19:14Эти вещи, не на ассемблере, а на сях (можно даже на C#) собираются делать, так что без разницы.Кстати, как раз-таки думал на ассемблере, просто потому что он у меня уже есть, а си какие-нибудь надо ещё где-то брать и устанавливать...
Цитата: Eitanbor от июля 10, 2023, 13:17Если в ОС, то, допустим, использовать регистры разных величин (rax вместо eax)Так вроде 32-битные программы полностью поддерживаются в 64-битной ОС, разве нет?
Цитата: Eitanbor от июля 10, 2023, 13:17Эти функции находятся в ОС или в Вашей программе?Le premier
Цитата: Eitanbor от июля 10, 2023, 13:17Если в ОС, то, допустим, использовать регистры разных величин (rax вместо eax)Эти вещи, не на ассемблере, а на сях (можно даже на C#) собираются делать, так что без разницы.
Цитата: Andrey Lukyanov от июля 9, 2023, 22:34Теж варіант, але не думаю, що написати свій емулятор з нуля буде простіше.Цитата: Python от июля 9, 2023, 11:48DOSBox цікавить мене, в першу чергу, як емулятор текстової консолі (з підтримкою можливостей, відсутніх у стандартному вікні командного рядка windows). Але при цьому було б непогано, щоб основна частина програми виконувалась у самій windows (чи іншій операційній системі, що працює на верхньому рівні), а DOSBox використовувався для її вводу-виводу як термінал.Можливо, краще створити якусь програму емулятора терміналу безпосередньо, без жодного DOS.
Цитата: mnashe от июля 10, 2023, 12:44Эти функции находятся в ОС или в Вашей программе?Цитата: Eitanbor от июля 10, 2023, 00:24Ещё надо, чтобы все это работало на 64-битных системахА какая разница? С чего бы функции отслеживания изменений в каталоге работать по-разному в 32 и 64?
Цитата: Eitanbor от июля 10, 2023, 00:24Ещё надо, чтобы все это работало на 64-битных системахА какая разница? С чего бы функции отслеживания изменений в каталоге работать по-разному в 32 и 64?
Страница создана за 0.071 сек. Запросов: 23.