node.js - Bestem den nuværende konsol codepage

Indlæg af Hanne Mølgaard Plasc

Problem



Er der en måde at opdage Windows Console codepage programmatisk inde fra et Node-script, bortset fra at køre chcp og parsere sin lokaltekst i fri tekst?


C:>chcp
Página de códigos activa: 850

Bedste reference


Kort svar: nej .


Det er dog muligt at oprette en pakke, der implementerer funktionen, og fra april 2018 er der chcp i NPM-registret. [18]


Du kan stoppe med at læse nu, medmindre du er interesseret i internals :)





Pakken indeholder en native add-on og et modul, der eksporterer den tilsvarende Win32 API-metode, der skal bruges fra JavaScript. [19]


Opskrift at oprette din egen pakke:



  1. Installer afhængigheder fra forhøjet prompt *:


    npm install --global --production windows-build-tools
    npm install --global node-gyp@latest
    


    (*) Forhøjet prompte er muligvis ikke nødvendig for node-gyp@latest, men jeg er ikke en ekspert, og det er hvad der fungerede for mig.

  2. Opret en fil kaldet binding.gyp:


    {
      "targets": [
        {
          "target\_name": "addon",
          "sources": [ "chcp.cc" ]
        }
      ]
    }
    

  3. Opret build-filer:


    node-gyp configure
    

  4. Opret en fil med din modul kildekode, f.eks. chcp.cc:


    #include <node.h>
    #include <windows.h>
    
    using namespace v8;
    
    void GET(const FunctionCallbackInfo<Value>& args) {
      Isolate* isolate = args.GetIsolate();
      Local<Number> chcp = Number::New(isolate, GetConsoleOutputCP());
      args.GetReturnValue().Set(chcp);
    }
    void init(Local<Object> exports) {
      NODE\_SET\_METHOD(exports, "get", GET);
    }
    NODE\_MODULE(NODE\_GYP\_MODULE\_NAME, init)
    


    Bemærk: Der er ingen efterfølgende ;

  5. Compile:


    node-gyp build
    

  6. Endelig require() den resulterende *.node fil (uden udvidelse, base navn kan ændres efter din mening) i din JavaScript kode:


    const chcp = require('./chcp')
    console.log(chcp.get());
    



Metoden .get() returnerer en number (fx 850).


Disse oplysninger blev samlet sammen med en supportbillet. [20]