티스토리 뷰

파이썬에는 php의 iconv같은 함수가 없어서 가끔 불편할 때가 있다. 에를 들어서 다음과 같은 경우가 있다. 나는 지금 pyaudio를 이용해서 현재 시스템에 장착되어 있는 오디오 장치에 뭐가 있는지 알아보려고 했다. 그래서 다음과 같은 소스를 사용했다.


1
2
3
4
5
6
7
8
9
import pyaudio
 
def getaudiodevices():
    p = pyaudio.PyAudio()
    for i in range(p.get_device_count()):
        name = p.get_device_info_by_index(i).get('name')
        print(name)
 
getaudiodevices();
cs


결과 : 

1
UnicodeEncodeError: 'cp949' codec can't encode character '\xbb' in position 10: illegal multibyte sequence
cs
cp949로 인코딩되어있기 때문에 출력을 시켜보면 오류가 나는 것을 볼 수 있다. 어찌어찌 해서 강제로 출력을 시켜봐도 아래와 같이 한글 부분이 깨져버리는 것을 볼 수 있다. 


1
2
3
4
5
6
Microsoft »ç¿îµå ¸ÅÆÛ - Input
¸¶ÀÌÅ©(Realtek High Definition
½ºÅ×·¹¿À ¹Í½º(Realtek High Defi
Microsoft »ç¿îµå ¸ÅÆÛ - Output
½ºÇÇÄ¿(Realtek High Definition
Realtek Digital Output(Realtek
cs
이런 현상이 일어나는 이유는 마이크로소프트의 윈도우즈10은 cp-949 인코딩을 사용하고, 파이썬에서는 utf-8인코딩을 사용하기 때문이다. 이것을 해결하기 위해서는 cp-949를 utf-8인코딩으로 바꿔주어야 한다.

마침 minjaesong이라는 분이 만든 cp-949/utf-8 1대1 변환 테이블 github에 올라와 있었다.


이제 위 링크에서 다운로드 받은 다음에 Cp949ToUniTable.py 파일만 따로 떼준 다음에 프로그램 소스와 같은 폴더에 넣어준다. cp-949를 utf-8로 변환시켜주는 소스는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pyaudio
import Cp949ToUniTable
 
def getaudiodevices():
    p = pyaudio.PyAudio()
 
    for i in range(p.get_device_count()):
        name = p.get_device_info_by_index(i).get('name')
 
        i = 0
        while True:
            if(i == len(name)): break
            if(Cp949ToUniTable.uni_conv_table[ord(name[i])] == 'LEAD'):
                print(chr(Cp949ToUniTable.uni_conv_table[ord(name[i])*0x100+ord(name[i+1])]),end="")
                i+=1
            else:
                print(chr(Cp949ToUniTable.uni_conv_table[ord(name[i])]),end="")
 
            i+=1
 
        print("")
 
getaudiodevices();
cs


결과:

1
2
3
4
5
6
0번 : Microsoft 사운드 매퍼 - Input
1번 : 마이크(Realtek High Definition
2번 : 스테레오 믹스(Realtek High Defi
3번 : Microsoft 사운드 매퍼 - Output
4번 : 스피커(Realtek High Definition
5번 : Realtek Digital Output(Realtek
cs

이제 한글이 완전히 출력되는 것을 볼 수 있다. 문자열이 잘리는 것은 아마 pyaudio 자체의 문제인 것 같다. 


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함