mu*index
lezen
thema
CHARSET  [protocol]
De telnet-optie uit RFC 2066 om een codering af te spreken. De reden dat namen
met accenten in een spel de reis overleven, en de bron van een paar subtiele
fouten wanneer hij ontbreekt.
https://www.rfc-editor.org/rfc/rfc2066

Gemeten adoptie
  114 van 886 vermelde spellen hebben we het zien aanbieden (12.9%)
  /nl/games?protocol=CHARSET

  De spellen die hier niet meetellen zijn geen spellen zonder het protocol. Een
  spel telt mee wanneer we zijn server de optie in een handshake hebben zien
  aanbieden; de rest zijn servers die het ons niet aangeboden hebben en servers
  waarvan we de handshake niet gelezen hebben, en welke van beide het is kunnen
  we niet zeggen.

  Naar codebase, van de spellen die we hebben vastgesteld
    PennMUSH             28 van 34 boden het aan
    FluffOS              16 van 28 boden het aan
    RhostMUSH            5 van 40 boden het aan
    ROM                  2 van 55 boden het aan
    SMAUG                1 van 20 boden het aan
    AresMUSH             0 van 18 boden het aan
    CircleMUD            0 van 47 boden het aan
    CobraMUSH            0 van 2 boden het aan
    CoffeeMUD            0 van 32 boden het aan
    DikuMUD              0 van 35 boden het aan
    Evennia              0 van 11 boden het aan
    MUCK                 0 van 24 boden het aan
    tbaMUD               0 van 5 boden het aan
    TinyMUSH             0 van 9 boden het aan

CHARSET is telnet-optie 42, gespecificeerd in RFC 2066. De ene kant biedt een
lijst met tekensets aan, de andere kiest er een, en daarna zijn beide het eens
over hoe bytes op tekens worden afgebeeld.

In de praktijk komt de onderhandeling uit op UTF-8 of vindt ze helemaal niet
plaats. De MUSH-familie onderhandelt er merkbaar vaker over dan de MUD-familie —
TinyMUX, RhostMUSH en PennMUSH doen het alle drie — en dat past bij een
bevolking die proza schrijft met namen erin.

WAT ER GEBEURT ZONDER

Een client moet raden, en de gebruikelijke gok is ASCII of Latin-1. Gok ASCII en
elke byte boven 0x7F wordt een vraagteken; gok Latin-1 op een UTF-8-server en
elk letterteken met een accent wordt twee leestekens. Beide fouten zien eruit
als de schuld van het spel en zijn dat niet.

Voor een crawler bijt dit op één bepaalde plek. Onze eigen telnet-bibliotheek
zet haar huidige codering standaard op ASCII, en die standaardwaarde is niet
onschuldig — het is waarmee elke byte gedecodeerd wordt, voor elke server die
nooit over CHARSET onderhandelt, en dat zijn de meeste. Daarom stellen we hem
bewust zelf in.

DE ENE PLEK WAAR CHARSET NIET KOMT

MSSP-veldnamen en -waarden worden als ASCII gedecodeerd, ongeacht waar CHARSET
op uitkwam, want een subonderhandeling is een commando en geen tekst, en de
specificatie beperkt CHARSET tot tekst. Dat is verdedigbaar conform en het is
verliesgevend: een spel waarvan de MSSP-NAME Café Noir is, meldt Caf? Noir, en
de oorspronkelijke bytes zijn weg voordat iets wat wij in de hand hebben ze
ziet.

Zie je op deze site een verminkt teken in een opgegeven veld en niet in de
uitvoer van het spel zelf, dan is dat de reden, en van onze kant valt het niet
meer te herstellen.

Zie ook
  TTYPE en MTTS — /nl/reference/protocols/ttype
  Hoe je verbinding maakt — /nl/reference/connecting
  TinyMUX — /nl/reference/codebases/tinymux