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?

1 curtida

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.

2 curtidas

@dpkoch Did you ever figure this out?

You can google stuff about UTF-8 encoding. You need to do something that will coerce the table into UTF-8. The time that I did it, there were further complications because some rows were in one format and others in another format. I think that I did some nonsense where I coerced things on a value-by-value basis.

1 curtida

Sounds awful… We’ll have to tinker with the table encoding and see what happens. Thanks!

Oh. It’s aweful. You best bet, based on a vague recollection of a single time I did this over a year ago, is to play around with as many different conversions as you can until you can finally hit on one that works for all or most data. I think that I did a bunch of one-by-one transformations that ended up being a waste of time when I stumbled on some conversion that worked for all (most?) data.

Here is what I did. Use at your own risk. (This was vbulletin, FWIW).

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

    # windows 1252
    all = ''
    win_encoded = ''

    ### WIN1252 encoding
    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 encoding
    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

That code is used within the import script or on the server/database side?

In the import script. I don’t like to mess with the database.

Somewhere you call this function on raw to fix raw (and maybe titles?).

Ok, thanks very much! This should give me a huge head-start in debugging this.

1 curtida

Conseguimos fazer isso funcionar adicionando um comando simples para codificar o arquivo como UTF-8 ao lê-lo, usando algo como encode\"UTF-8\" nas linhas 76-80 do script de importação vanilla.rb.

Estou apenas aguardando a confirmação da sintaxe exata do cara que fez isso via linha de comando. Atualizarei isto quando a tiver.

1 curtida

Aqui está o que ele usou para corrigir isso, começando na linha 76 de vanilla.rb

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
1 curtida

Uma postagem foi dividida em um novo tópico: Como editar um script de importação no servidor de produção?

Isso não funciona. Mesmo erro.

Você precisa pesquisar sobre codificação no Google e descobrir como corrigir sua codificação corrompida.

Olá @ddeveloper,

Trabalhei nesse processo há apenas alguns meses (e não sou desenvolvedor :slightly_smiling_face:) e consegui migrar com sucesso um fórum Vanilla auto-hospedado para Discourse auto-hospedado. Uma coisa que foi fundamental para mim foi garantir, ao exportar os dados com o Vanilla Porter, que eu selecionasse “Vanilla 2” como o Source Forum Type no primeiro menu suspenso.

Usei a versão 2.6 do Vanilla Porter, disponível para download como um arquivo zip aqui: Vanilla Porter 2.6 RC1 — Vanilla Forums em vez da versão 2.5 vinculada em Migrate a Vanilla forum to Discourse.

Se bem me lembro, não encontrei o erro UTF-8 novamente ao usar o script mais recente do Vanilla Porter e o tipo de fórum “Vanilla 2”.

Se essas duas sugestões não fizerem diferença para sua importação, por favor, forneça alguns detalhes sobre as etapas que você tomou até agora e exatamente o que você está vendo. Às vezes, existem pequenas variações no “mesmo erro” que podem fazer uma grande diferença na solução de problemas.

5 curtidas

Eu segui o mesmo guia, exceto usando a versão 2.6 do porter. Usarei o arquivo de exportação da versão 2.6 e atualizarei aqui.

Ok, tentei o porter 2.6 e ele resultou no mesmo erro de UTF-8:

Até agora, segui este guia: Migrate a Vanilla forum to Discourse

Tudo correu bem até este erro de codificação UTF-8. Algumas pessoas resolveram este problema. Tentei essas soluções e elas não funcionaram para mim.

Tentei a solução do @Nick_Chomey acima; tentando forçar a codificação utf-8 ao ler o arquivo txt, mas para minha frustração, também não funcionou.

Só para ter certeza, qual Tipo de Fórum de Origem você selecionou no menu suspenso do Vanilla Porter?

Você poderia nos dizer que tipo de computador você está usando? As instruções para converter seu arquivo para codificação UTF-8 variarão.

1 curtida

Obrigado por dedicar tempo para ajudar um colega do fórum.

Selecionei “Vanilla 2” em Source Forum Type.

Posso usar dispositivos baseados em Windows e Linux e tenho acesso a ambos.