advpl-encoding
Skill1 starsChanged 6 months agoMITView on GitHub
Política de encoding em fontes ADVPL/TLPP — cp1252 para .prw clássico, utf-8 para .tlpp moderno, preserve-by-default. Use antes de Edit/Write em .prw/.prx/.tlpp.
In this repository29 other files it gives its agents.
- advpl-advancedSkill
- advpl-code-reviewSkill
- advpl-dicionario-sxSkill
- advpl-embedded-sqlSkill
- advpl-fundamentalsSkill
- advpl-jobs-rpcSkill
- advpl-matxfisSkill
- advpl-mvc-avancadoSkill
- advpl-mvcSkill
- advpl-pontos-entradaSkill
- advpl-tlppSkill
- advpl-webserviceSkill
- advpl-webSkill
- archSkill
- calleesSkill
- callersSkill
- doctorSkill
- findSkill
- grepSkill
- helpSkill
- ingestSkill
- initSkill
- lintSkill
- paramSkill
- plugadvpl-index-usageSkill
- reindexSkill
- setupSkill
- statusSkill
- tablesSkill
The file
Files
advpl-encoding — cp1252 / utf-8 preserve-by-default
Fontes ADVPL/TLPP em projetos Protheus reais misturam dois encodings:
.prw/.prxclássicos → cp1252 (Windows-1252)..tlppmoderno → UTF-8 é suportado e usado em código novo (TOTVS recomenda).
Em clientes grandes essas duas extensões coexistem no mesmo repositório. Algumas codebases legadas chegam a ter .prw em UTF-8 (raro, mas existe). A regra é: preserve o encoding detectado, nunca normalize por conta própria.
Quando usar
- Antes de qualquer
EditouWriteem.prw,.prx,.tlpp. - Quando o usuário menciona "acento errado", "ç", "ã", "caractere quebrado", "mojibake", "encoding".
- Quando ler um arquivo via
Reade verçouãno output (sinal de cp1252 lido como utf-8). - Antes de rodar
/plugadvpl:ingestem base nova (verifique a política).
Caracteres que tipicamente quebram
Ao salvar cp1252 como UTF-8 (ou vice-versa) sem decodificar corretamente, estes caracteres viram lixo:
| Char cp1252 | Byte cp1252 | Lido como UTF-8 (mojibake) |
ç | 0xE7 | ç |
ã | 0xE3 | ã |
á | 0xE1 | á |
é | 0xE9 | é |
ó | 0xF3 | ó |
Á | 0xC1 | Ã |
' (curly) | 0x92 | ’ virou byte inválido |
° | 0xB0 | ° |
Comentários // Atualizacao viram // Atualização quando lidos errado. Pior: o compilador AppServer rejeita o arquivo, ou compila e quebra strings em runtime.
Como o parser plugadvpl detecta
Algoritmo (rápido, validado em ampla base de fontes ADVPL):
- Fast-path: tenta decodificar como cp1252 → sucesso? grava
encoding='cp1252'emsources.encoding. - Fallback: se cp1252 falhar (caracteres não-mapeáveis no header), tenta UTF-8.
- Última cartada:
chardet[:4096](sample do início do arquivo) para detecção heurística. .tlppcomeça direto pela tentativa UTF-8 (extensão sugere TLPP moderno), depois cai para cp1252.
A coluna encoding da tabela sources registra o resultado. Consulte ela antes de editar.
Política --encoding-policy
/plugadvpl:ingest aceita uma das três políticas:
preserve(default) — armazena o encoding detectado por fonte, não impõe regra global. Recomendado.cp1252— assume cp1252 para.prw/.prx; emite warning para.tlppUTF-8 detectado.utf8-warn— emite warning para qualquer fonte que NÃO seja UTF-8 (útil em migração ativa).
Para edição feita por Claude, preserve sempre.
Workflow correto antes de Edit
- Consulte
/plugadvpl:statusou rodeSELECT encoding FROM sources WHERE arquivo='X.prw'. - Se Claude vê mojibake no
Read, não é o arquivo que está corrompido — é a IDE/tool lendo errado. Confirme com/plugadvpl:doctor. - Ao editar, mantenha bytes literais: não cole texto de outra fonte UTF-8 num arquivo cp1252 sem converter.
- Para arquivos novos: siga a extensão.
.prwnovo → cp1252;.tlppnovo → UTF-8.
Exemplo — comentário com acento
.prw (cp1252, byte E7 para ç):
// Função de validação do código do cliente
User Function ValCli()
Local cMsg := "Operação concluída com sucesso"
Return .T.Os bytes do source: // Fun\xe7\xe3o de valida\xe7\xe3o. Se Claude leu como UTF-8, vai ver // Função. Não “conserte” isso editando — o arquivo está correto, o problema é o decoder.
Anti-padrões
- "Vou normalizar tudo pra UTF-8 para evitar problemas" → NÃO. Quebra compilação no AppServer clássico e desalinha includes
#include "TOTVS.CH". - Salvar
.prwcom BOM UTF-8 (EF BB BF) → AppServer rejeita. - Editar
.tlppem cp1252 só porque o resto do projeto é cp1252 → perde recurso natural do TLPP. - Confiar em "abrir e olhar" — use
file -i(Linux/WSL) ou/plugadvpl:doctorpara encoding real.
Referência rápida
| Extensão | Encoding esperado | Alternativa aceita | Política Claude |
.prw | cp1252 | (raro) utf-8 | preserve |
.prx | cp1252 | — | preserve |
.tlpp | utf-8 | cp1252 (legado) | preserve |
.ch | cp1252 | utf-8 | preserve |
.th | utf-8 | — | preserve |
Comandos plugadvpl relacionados
/plugadvpl:doctor— checa encoding real de cada fonte ingesto./plugadvpl:ingest --encoding-policy {cp1252|preserve|utf8-warn}— controla detecção./plugadvpl:status— mostra distribuição de encodings na base.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

