SORU
8 EKİM 2013, Salı


TEKRAR hata: Mac OS üzerinde geçersiz bir bayt sırası X

Dize çift tırnak gömülü olan Mac OS X üzerinde bir dize değiştirmek için çalışıyorum. Komut:

sed -i "" 's|"iphoneos-cross","llvm-gcc:-O3|"iphoneos-cross","clang:-Os|g' Configure

Ve hata

sed: RE error: illegal byte sequence

Hayır joy tırnak, virgül, çizgi ve iki nokta üst üste çift kaçmayı denedim. Örneğin:

sed -i "" 's|\"iphoneos-cross\"\,\"llvm-gcc\:\-O3|\"iphoneos-cross\"\,\"clang\:\-Os|g' Configure

Kimseye baskı sed geçersiz bir bayt sırası pozisyon almak için nasıl biliyor mu? Ya herkes yasadışı bayt sırası ne olduğunu bilen var mı?

CEVAP
10 Mayıs 2014, CUMARTESİ


Kullanarakformerly accepted answer eğer destek kaybetme gerçek bölgeniz için bir sakıncası yok, eğer öyle bir seçeneğin olduğunuABD sistemi sensin ve seni asla yabancı karakterler ile başa çıkmak için, bu iyi olabilir.)

Ancakaynı etkiye sahip olabilirad-hocbir içintek komutsadece:

LC_ALL=C sed -i "" 's|"iphoneos-cross","llvm-gcc:-O3|"iphoneos-cross","clang:-Os|g' Configure

Önemli bir not: ^em>etkiliLC_CTYPE=C sed ... diye C 15 ** ayarnormaldeayrıca iş, ama eğer LC_ALL (bir şey C dışında) olursa LC_CTYPEgibi LC_*-kategori bireysel değişkenler geçersiz kılar. Böylece, en sağlam yaklaşım LC_ALL ayarlamaktır.

Ancak, (etkin) C 23 *ayar dizeleri davranıreğer her bayt olarak kendi karakteri(hayıryorum kuralları gerçekleştirilir kodlaması)hiçbir konuda- boş-isteğe bağlı - içinUTF-8 kodlamasıOS X varsayılan olarak kullanıryabancı karakterlervarboş kodlamalar.

Özetle:C 25 *ayarıkabuk ve kamu hizmetleri sadece harf olarak temel İngilizce mektuplar (7-bit ASCII aralığında olanlar) tanımak için neden olur, böyleceyabancı karakter. mektupları olarak kabul edilecektirörneğin , üst/küçük harf dönüştürme başarısız olmasına neden.

Yine, bu ise gerek yok olsa iyi olabilirmaçboş kodlanmış* *27, ve sadece gibi bir karakter istiyorumböyle bir karakter geçmek.

Eğer bu yetersiz ve/veyanedenini anlamakorijinal hata (giriş bayt soruna neden ne belirlenmesi de dahil olmak üzere)kodlama dönüşümleri gerçekleştirmekisteğe bağlıokumaya devam edinaşağıda.


Sorun giriş dosyası kodlama shell eşleşmiyor.
Daha spesifik olarak,girdi dosyası UTF-8 karakter geçersiz bir şekilde kodlanmış içerir(@Klas Lindbäck bir yorumda belirtildiği gibi) - sed hata mesajı invalid byte sequence ile söylemeye çalıştığı şey bu.

Büyük olasılıkla, giriş dosyası kullanırtek-bayt 8 bit kodlamaISO-8859-1, sık sık "Batı" dil. Avrupa kodlamak için kullanılır gibi

Örnek:

31* *aksanlı harf 0xE0 (224) - ISO-8859-1 aynı Unicode codepoint vardır. Ancak, doğası gereğiUTF-8kodlama, bu tek codepoint olarak temsil edilir2bu geçirmeye çalışıyor oysa bayt - 0xC3 0xA0,bayt tek0xE0geçersizUTF-8 altında.

İştesorunun gösteridize kullanarak voilà ISO-8859-1, à ile temsil edilen olarak kodlanmışbirbayt (\x{e0} bayt oluşturmak için kullandığı ANSI-C-alıntı bash bir dize ($'...')):

sed komut hayır-op sadece üzerinden giriş geçirir, ama hata oluşturmamız gerekiyor: bir etkin olduğunu unutmayın

  # -> 'illegal byte sequence': byte 0xE0 is not a valid char.
sed 's/.*/&/' <<<$'voil\x{e0}'

Sadecegörmezdensorunkullanılabilir:,

  # No error, bytes are passed through ('á' will render as '?', though).
LC_CTYPE=C sed 's/.*/&/' <<<$'voil\x{e0}'

İstersenizsoruna neden olan belirlemek, aşağıdakini deneyin:

  # Convert bytes in the 8-bit range (high bit set) to hex. representation.
  # -> 'voil\x{e0}'
iconv -f ASCII --byte-subst='\x{x}' <<<$'voil\x{e0}'

Çıkış yüksek bit set (7-bit ASCII aralığı aşan bayt) onaltılık biçimde tüm bayt gösterir. (O da doğru kodlanmış UTF-8 boş dizileri içerir - daha sofistike bir yaklaşım özellikle--UTF-8 geçersiz bir bayt tanımlamak için gerekli olacağını unutmayın.)


İstek üzerine sahne kodlama dönüşümleri:

iconv dönüştürmek için kullanılabilir standart programı (-t) ve (-f) kodlamalar; iconv -l gelen/desteklenen tüm olanları listeler.

Örnekler:

Kabuk etkisi kodlama UTF-8 tabanlı, varsayılan olarak hangi LC_CTYPE dayalı) ISO-8859-1örnek yukarıda: bina dönüştürmek

  # Converts to UTF-8; output renders correctly as 'voilà'
sed 's/.*/&/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')"

Bu unutmayındönüşüm düzgün yabancı bir karakteri eşleştirmek için izin verir:

  # Correctly matches 'à' and replaces it with 'ü': -> 'voilü'
sed 's/à/ü/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')"

Giriş ISO-8859-1 TEKRAR işleme sonra dönüştürmek için, sadece iconv başka bir komut sonucu boru:

sed 's/à/ü/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')" | iconv -t ISO-8859-1

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Saquet

    Caroline Saq

    1 EKİM 2011
  • RealPapaPit

    RealPapaPit

    16 Mart 2009
  • Tomas N

    Tomas N

    14 Kasım 2010