Error importing from vanilla: invalid byte sequence in UTF-8

I’m trying to import from a Vanilla forum using the instructions posted here. However, I get the following error when I run the vanilla.rb import script:

Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
parsing file...
reading file...
Traceback (most recent call last):
	5: from script/import_scripts/vanilla.rb:254:in `<main>'
	4: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
	3: from script/import_scripts/vanilla.rb:17:in `execute'
	2: from script/import_scripts/vanilla.rb:37:in `parse_file'
	1: from script/import_scripts/vanilla.rb:72:in `read_file'
script/import_scripts/vanilla.rb:72:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)

I’ve tried changing the MySQL database character set to UTF8 following the instructions here and then re-exporting the porter file, but that didn’t resolve the issue. Any suggestions?

You either need to keep trying to get it to really be UTF-8 or modify the import script to do it. It is a frustrating problem.

@dpkoch 혹시 이 문제를 해결하셨나요?

UTF-8 인코딩에 대해 검색해 볼 수 있습니다. 테이블을 UTF-8로 강제 변환하는 do something이 필요합니다. 제가 그 작업을 수행했을 때는 일부 행은 한 형식, 다른 행은 또 다른 형식으로 저장되어 있어 더 복잡한 문제가 있었습니다. 값별로 강제 변환하는 다소 어이없는 작업을 수행했던 것 같습니다.

별로 좋지 않네요… 테이블 인코딩을 조금씩 조정해 보고 어떻게 되는지 확인해 봐야겠어요. 감사합니다!

아니, 정말 끔찍하군요. 1년 전에 한 번 해본 기억이 희미할 뿐이라, 가장 좋은 방법은 모든 데이터(또는 대부분)에 적용되는 변환 방식을 찾을 때까지 다양한 변환을 시도해 보는 것입니다. 저는 하나씩 변환을 여러 번 시도하다가 결국 모든(대부분의?) 데이터에 적용되는 변환 방식을 발견했을 때, 그 전까지의 노력이 시간 낭비였다는 것을 깨달았습니다.

아래는 제가 했던 방법입니다. 사용은 본인의 책임 하에 해주시기 바랍니다. (참고로 이 경우 vBulletin이었습니다.)

  def char_map(raw_original)
    raw = raw_original.dup
    debug = false # (raw.length > 50)

    # windows 1252
    all = ''
    win_encoded = ''

    ### WIN1252 인코딩
    win_encoded = ''
    begin
      win_encoded = raw.force_encoding('utf-8').encode("Windows-1252",
                            invalid: :replace, undef: :replace, replace: ""
                           ).force_encoding('utf-8').scrub
    rescue => e
      puts "\n#{'-'*50}\nWin1252 failed for \n\n#{raw}\n\n"
      win_encoded = ''
    end

    ### ISO 8859 인코딩
    iso_encoded = ''
    if all.length == 0 && win_encoded.length > 0 && win_encoded != raw
      all = (debug ? "Win1252--" : '') + win_encoded
    else
      all = raw
    end
    all = old_char_map(all)
    all
  end

그 코드는 가져오기 스크립트 안에서 사용되나요, 아니면 서버/데이터베이스 쪽에서 사용되나요?

가수입 스크립트에서요. 데이터베이스를 건드리고 싶지 않아요.

어딘가에서 이 함수를 raw에 호출해서 raw를(그리고 제목도?) 수정하는 부분이 있을 거예요.

네, 정말 감사합니다! 덕분에 디버깅을 훨씬 빠르게 시작할 수 있을 것 같아요.

76~80번째 줄의 vanilla.rb 가져오기 스크립트에 encode"UTF-8"와 같은 코드를 추가하여 파일을 읽을 때 UTF-8로 인코딩하는 간단한 명령어를 넣는 방식으로 이 문제를 해결했습니다.

명령줄로 작업을 수행한 담당자에게 정확한 구문에 대한 확인을 기다리고 있습니다. 확인이 완료되면 이 내용을 업데이트하겠습니다.

그가 이 문제를 해결하기 위해 사용한 방법은 다음과 같습니다. vanilla.rb 파일의 76번째 줄부터 시작합니다.

def read_file
  puts "reading file..."
  string = [File.read](http://file.read/)(@vanilla_file)
    .force_encoding('UTF-8').encode("UTF-8").gsub("\\N", "")
    .force_encoding('UTF-8').encode("UTF-8").gsub(/\\$\n/m, "\\n")
    .force_encoding('UTF-8').encode("UTF-8").gsub("\\,", ",")
    .force_encoding('UTF-8').encode("UTF-8").gsub(/(?<!\\)\\"/, '""')
    .force_encoding('UTF-8').encode("UTF-8").gsub(/\\\\\\"/, '\\""')
  [StringIO.new](http://stringio.new/)(string)
end

이렇게 하면 작동하지 않습니다. 동일한 오류가 발생합니다.

인코딩에 대해 검색해서 깨진 인코딩을 어떻게 수정해야 하는지 알아내야 합니다.

@ddeveloper 님, 안녕하세요.

저도 몇 달 전 이 과정을 직접 거쳤는데(저는 개발자가 아닙니다 :slightly_smiling_face:), 셀프호스팅된 Vanilla 포럼을 셀프호스팅된 Discourse로 성공적으로 마이그레이션했습니다. 저에게 가장 중요했던 점은 Vanilla Porter를 사용해 데이터를 내보낼 때, 첫 번째 드롭다운 메뉴에서 Source Forum Type(소스 포럼 유형)으로 "Vanilla 2"를 선택하는 것이었습니다.

저는 https://meta.discourse.org/t/migrate-a-vanilla-forum-to-discourse/27273에 링크된 2.5 버전 대신, https://open.vanillaforums.com/discussion/38882/vanilla-porter-2-6-rc1에서 zip 파일로 다운로드할 수 있는 Vanilla Porter 2.6 버전을 사용했습니다.

기억이 정확하지는 않지만, 더 새로운 버전의 Vanilla Porter 스크립트와 “Vanilla 2” 포럼 유형을 사용할 때 UTF-8 에러가 다시 발생하지 않았습니다.

이 두 가지 제안이 여러분의 가져오기에 도움이 되지 않는다면, 지금까지 진행하신 단계와 정확히 어떤 현상이 나타나는지에 대한 세부 정보를 제공해 주십시오. 문제 해결 시 "같은 에러"라고 해도 사소한 차이가 큰 영향을 미칠 수 있습니다.

포터 2.6 버전을 사용하되, 동일한 가이드를 따랐습니다. 2.6 버전의 내보내기 파일을 가져와서 여기에 업데이트하겠습니다.

네, Porter 2.6을 시도해 봤는데 같은 UTF-8 오류가 발생했습니다:

지금까지 이 가이드를 따랐습니다: Migrate a Vanilla forum to Discourse

이 UTF-8 인코딩 오류가 발생하기 전까지는 모든 것이 순조롭게 진행되었습니다. 이 문제를 해결한 사람들이 몇 명 있습니다. 그들의 방법도 시도해 봤지만 제 경우에는 효과가 없었습니다.

위에서 @Nick_Chomey 님의 해결책도 시도해 봤습니다. txt 파일을 읽을 때 UTF-8 인코딩을 강제하는 방식이었지만, 안타깝게도 이 역시 효과가 없었습니다.

확인차 여쭤볼게요, Vanilla Porter 드롭다운 메뉴에서 어떤 Source Forum Type을 선택하셨나요?

사용 중인 컴퓨터 종류를 알려주시겠어요? UTF-8 인코딩으로 파일을 변환하는 방법은 컴퓨터 종류에 따라 달라질 수 있습니다.

동료 디스크러서(Discourse) 사용자를 도우려고 시간을 내주셔서 감사합니다.

Source Forum Type에서 "Vanilla 2"를 선택했습니다.

Windows 기반과 Linux 기반 기기를 모두 사용할 수 있으며, 두 환경에 모두 접근할 수 있습니다.