2014-07-10 4 views
3

ä, ü 또는 ß과 같은 독일어와 네덜란드어 움라우트를 대체하려고합니다. 그들은 ä 대신에 ae와 같이 써야합니다. 그래서 저는 한 숯을 다른 숯으로 단순히 번역 할 수 없습니다.문자를 복수 문자로 바꾸십시오.

더 세련된 방법이 있습니까? 사실 그것은 (완료되지 아직)처럼 보이는 :

ERROR: invalid byte sequence for encoding "UTF8": 0xdc27

시도 : 나는 Ü를 검색 할 때 나는이있어

: 내 길에

SELECT addr, REPLACE (REPLACE(addr, 'ü','ue'),'ß','ss') FROM search; 

내가 또 다른 문제를 가지고 서로 다른 명령을 시도 그것은 U&'\0220'으로, 그것은 아무것도 대체하지 못했습니다. ü (소문자로는 ü) 만 사용하여 올바르게 바뀌 었습니다. 유니 코드로 뭔가를해야하지만 어떻게이 문제를 해결할 수 있습니까?

친절히부터 독일. :)

+1

유니 코드 이스케이프 시퀀스는 16 진수입니다. 당신은'U & '\ 00DC''를 원합니다. –

답변

3

서버 인코딩은 UTF8 인 것 같습니다.
귀하의 client_encoding이 일치하지 않는다고 생각합니다. 귀하의 상대적인 인상을 줄 수도 있습니다. 확인 :

SHOW client_encoding; -- in your actual session 

그리고이 관련 답변을 읽어 툴 체인의 나머지가 동기화되어야합니다
Can not insert German characters in Postgres
Replace unicode characters in PostgreSQL

을 너무. 예를 들어, puTTY를 사용할 때, 단말기가 나머지와 동의하는지 확인해야합니다 : Change settings... Window -> Translation -> Remote character set = UTF-8.

첫 번째 질문에 대해서는 이미 최상의 해결책이 있습니다. 두 개의 움라우트는 replace() 문으로 가장 잘 대체됩니다.

이미 알고있는 것처럼 단일 문자 대체는 (단일) translate() 문을 사용하면 더 효율적입니다.

관련 : 다른 이유 옆에

+0

클라이언트/서버 인코딩 불일치에 대해 잘 모르겠습니다. 내 경험상, 그런 종류의 매핑 실패는 보통 "인물에는 동등한"오류가 없다. "잘못된 바이트 시퀀스"는 'client_encoding'이 UTF8로 설정되어있는 것처럼 들리지만 클라이언트 프로그램은 여전히 ​​ANSI 데이터를 보내고 있습니다. –

+0

@NickBarnes : 클라이언트는 'clent_encoding'에 따라 인코딩 된 데이터를 보냅니다. 'client_encoding'은 두 가지 방법으로 진행됩니다. 그래서 우리는 아마 같은 것을 여기서 말하고있을 것입니다. –

+1

아닙니다. 서버는'client_encoding'에 따라 클라이언트의 데이터를 해석하지만 클라이언트는 원하는 것을 보낼 수 있습니다. 예를 들어, Windows에서'psql'을 실행하면 기본값은 WIN1252입니다. 'SET client_encoding TO 'UTF8''과'SELECT'Ü''를 실행하면 "잘못된 바이트 순서"오류가 발생합니다. 'psql'은 아무것도 변경되지 않았다는 것을 전혀 모릅니다. ANSI로 데이터를 보내고 있습니다. –

0

나는 파이썬의 교체를 쓰기로했다. Erwin이 전에 쓴 것처럼, replace - 명령을 결합하는 더 좋은 해결책은없는 것 같습니다.

일반적으로 꽤 간단하고 인코딩을 사용하지 않아도됩니다. 이제 내 "최종"솔루션은 다음과 같습니다.

ger_UE="Ü" 
ger_AE="Ä" 
ger_OE="Ö" 
ger_SS="ß" 

dk_AA="Å" 
dk_OE="Ø" 
dk_AE="Æ" 

cur.execute("""Select addr, REPLACE (REPLACE (REPLACE(REPLACE (REPLACE (REPLACE (REPLACE(addr, '%s','UE'),'%s','OE'),'%s','AE'),'%s','SS'),'%s','AA'),'%s','OE'),'%s','AE') 
    from search WHERE x = '1';"""%(ger_UE,ger_OE,ger_AE,ger_SS,dk_AA,dk_OE,dk_AE)) 

이제 큰 테이블에 도달 할 때의 속도를 기대하고 있습니다. 누구나 일부 주석을 달고 싶으면 대단히 환영합니다.

답장을 보내 주셔서 감사합니다.

관련 문제