binary – Why does the BOM consist of two bytes instead of one for example in encoding utf-16

The BOM started out as an encoding trick. It was not part of Unicode, it was something that people discovered and cleverly (ab)used.

Basically, they found the U+FEFF Zero width non-breaking space character. Now, what does a space character that has a width of zero and does not induce a linebreak do at the very beginning of a document? Well, absolutely nothing! Adding a U+FEFF ZWNBSP to the beginning of your document will not change anything about how that document is rendered.

And they also found that the code point U+FFFE (which you would decode this as, if you decoded UTF-16 “the wrong way round”) was not assigned. (U+FFFE0000, which is what you would get from reading UTF-32 the wrong way round, is simply illegal. Codepoints can only be maximal 21 bits long.)

So, what this means is that when you add U+FEFF to the beginning of your UTF-16 (or UTF-32) encoded document, then:

  • If you read it back with the correct Byte Order, it does nothing.
  • If you read it back with the wrong Byte Order, it is a non-existing character (or not a code point at all).

Therefore, it allows you to add a code point to the beginning of the document to detect the Byte Order in a way that works 100% of the time and does not alter the meaning of your document. It is also 100% backwards-compatible. In fact, it is more than backwards-compatible: it actually works as designed even with software that doesn’t even know about this trick!

It was only later, after this trick had been widely used for many years that the Unicode Consortium made it official, in three ways:

  • They explicitly specified that the code point U+FEFF as the first code point of a document is a Byte Order Mark. When not at the beginning of the document, it is still a ZWNBSP.
  • They explicitly specified that U+FFFE will never be assigned, and is reserved for Byte Order Detection.
  • They deprecated U+FEFF ZWNBSP in favor of U+2060 Word Joiner. New documents that have an U+FEFF somewhere in the document other than as the first code point should no longer be created. U+2060 should be used instead.

So, the reason why the Byte Order Mark is a valid Unicode character and not some kind of special flag, is that it was introduced with maximum backwards-compatibility as a clever hack: adding a BOM to a document will never change it, and you don’t need to do anything to add BOM detection to existing software: if it can open the document at all, the byte order is correct, and if the byte order is incorrect, it is guaranteed to fail.

If, on the other hand, you try to add a special one-octet signature, then
all UTF-16 and UTF-32 reader software in the entire world has to be updated to recognize and process this signature. Because if the software does not know about this signature, it will simply try to decode the signature as the first octet of the first code point, and the first octet of the first code point as the second octet of the first code point, and further decode the entire document shifted by one octet. In other words: adding the BOM would completely destroy any document, unless every single piece of software in the entire world that deals with Unicode is updated before the first document with a BOM gets produced.

However, going back to the very beginning, and to your original question:

Why does the BOM consist of two bytes

It seems that you have a fundamental misunderstanding here: the BOM does not consist of two bytes. It consists of one character.

It’s just that in UTF-16, each code point gets encoded as two octets. (To be fully precise: a byte does not have to be 8 bits wide, so we should talk about octets here, not bytes.) Note that in UTF-32, for example, the BOM is not 2 octets but 4 (0000FEFF or FFFE0000), again, because that’s just how code points are encoded in UTF-32.

Quanto de matemática eu preciso entender pra ser um bom programador em javascript?

Então, iniciei um curso de javascript faz umas duas semanas, e tava tudo indo bem, pegando os fundamentos, entendendo umas coisas ali, n entendendo outras, mas ok. Agora me deparei com 40 exercícios, muitos problemas matemáticos, eu até gosto de matemática, mas estou com muito dificuldade pra entregar o que o exercício pede, uns eu consigo, mas outros não. Por isso queria saber ai dos programadores que tem mais anos nessa área, se eu preciso saber tanto assim de matemática pra programar em front-end e back-end.

Alguém bom em programação?

Neste desafio, você deve implementar a função somaDeGauss, que:
recebe 1 parâmetro: numeroMaximo, que deve ser um número inteiro;
retorna a soma de todos os números inteiros de 1 até o numeroMaximo.

Observação: você não deve utilizar Fórmula Matemática de Gauss (soma dos termos de uma Progressão Aritmética) para resolver este problema. O objetivo é que você consiga resolvê-lo através de conceitos de programação. Soluções que utilizem a Fórmula Matemática de Gauss serão DESCONSIDERADAS.

Estou começando, não tenho um pc bom, (HP mini 210) e venho pedir uma opinião, JAVA ou PYTHON para esse PC?

Obrigado por contribuir com o Stack Overflow em Português!

  • Certifique-se de responder à pergunta. Entre em detalhes sobre a sua solução e compartilhe o que você descobriu.

Mas evite

  • Pedir esclarecimentos ou detalhes sobre outras respostas.
  • Fazer afirmações baseadas apenas na sua opinião; aponte referências ou experiências anteriores.

Para aprender mais, veja nossas dicas sobre como escrever boas respostas.

Binacncr Bom Round 3

🔎 New Airdrop: Binacncr Bom Round 3 (Bom)
💰 Value: 5 BOM (1BOM = 1BNB)
👥 Referral: 1 BOM
🤖Start bot: Start
🏦Withdraw date: 9-04-2021
⚠️5 refer mandatory for withdraw⚠️

sql – Seria esse tema bom para TCC?

Será que esse título seria bom para um TCC verificação da diferença de desempenho entre Banco de dados relacionais e NoSQL

java – bom dia, tenho o seguinte codigo para imprimir cupom, mas ele não corta o papel automaticamente depois de imprimir,alguma ideia

public void Imprimir(String textoParaImprimir){
try{
InputStream prin = new ByteArrayInputStream(textoParaImprimir.getBytes());
DocFlavor docFlavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
SimpleDoc documentoTexto = new SimpleDoc(prin, docFlavor, null);
PrintService impressora = PrintServiceLookup.lookupDefaultPrintService();

    // Pega a Impressora padrão
    
    PrintRequestAttributeSet printerAttributes = new HashPrintRequestAttributeSet();
    printerAttributes.add(new JobName("Impressao", null));
    printerAttributes.add(OrientationRequested.PORTRAIT);
    printerAttributes.add(MediaSizeName.ISO_A4);
    
    
    // Informa o tipo de Folha
    
    DocPrintJob printJob = impressora.createPrintJob();
        
        
    
    try{
        printJob.print(documentoTexto, (PrintRequestAttributeSet) printerAttributes);
        
       
    
        //tenta Imprimir
    }catch(Exception e){
        JOptionPane.showMessageDialog(rootPane, "Não foi possível Imprimir", "Erro", JOptionPane.ERROR_MESSAGE);
    }
    prin.close();
}catch(Exception e){
    
}
    
}

c++ – Como obter um bom resultado com o Tesseract-ocr + OpenCV?

Galera, estou tentando extrair textos (em sua grande maioria, números) de imagens utilizando o Tesseract em conjunto do OpenCV. Tenho tentado a um tempo criar um programa que faça isso, mas tenho falhado… O problema é que, por mais que eu procure tutoriais e códigos em livros para testar, nunca obtenho o resultado esperado. Eu sempre sigo tudo como deve ser, utilizando os filtros e contornos com o auxílio das funções do OpenCV, mas quando chega na hora do reconhecimento, o resultado sempre são letras sem sentido, símbolos que não existem ma imagem e um monte de espaçamento sem motivo aparente.

Alguém poderia me ajudar nesse problema?

Basicamente o que eu preciso é entender como obter os textos esperados lendo uma simples imagem. Se alguém souber como usar as funcionalidades do tesseract com precisão e puder me ajudar, ficaria muito grado.

Lembrando que eu programo em C++, utilizo o Ubuntu e já fiz inúmeros testes diferentes e nenhum deles com um resultado decente.

Esse código está bom?

Olá, eu criei um código em Javascript de um cronometro bem simples, eu gostaria que pessoas mais experientes me dissessem se o código está bom e limpo, e no que eu poderia melhorar.

// VARIAVÉIS

let horas = 0, minutos = 0, segundos = 0, decimos = 0, estado = "parado";

// DOM

let elementos = {
    horas : document.getElementById('horas'),
    minutos : document.getElementById('minutos'),
    segundos : document.getElementById('segundos'),
    textos : document.getElementsByClassName('texto')
}
let alterar = {
    horas : function () {
        if (horas > 9) {
            elementos.horas.innerHTML = horas.toString();
        } else {
            elementos.horas.innerHTML = "0" + horas.toString();
        }
    },
    minutos : function () {
        if (minutos > 9) {
            elementos.minutos.innerHTML = minutos.toString();
        } else {
            elementos.minutos.innerHTML = "0" + minutos.toString();
        }
    },
    segundos : function () {
        if (segundos > 9) {
            elementos.segundos.innerHTML = segundos.toString();
        } else {
            elementos.segundos.innerHTML = "0" + segundos.toString();
        } 
    },
    trocarCor : function (c) {
        if (c == 1) {
            for (var i = 0; i < elementos.textos.length; i++) {
                elementos.textos(i).style.color = "#f00";
            }
        } else {
            for (var i = 0; i < elementos.textos.length; i++) {
                elementos.textos(i).style.color = "#fff";
            }
        }
    }
}

// LÓGICO

let timer = {
    motor : function() {
        if (estado == "rodando") {
            decimos++;
            if (decimos == 10) {
                segundos++;
                decimos = 0;
                if (segundos == 60) {
                    minutos++;
                    segundos = 0;
                } if (minutos == 60) {
                    horas++;
                    minutos = 0;
                }
                alterar.segundos();
                alterar.minutos()
                alterar.horas()
            }
            setTimeout(timer.motor, 100);
        }
    },
    iniciar : function () {
        if (estado != "rodando") {
            estado = "rodando";
            this.motor();
            alterar.trocarCor(0);
        }
    },
    zerar : function() {
        estado = "parado";
        horas = 0, segundos = 0, decimos = 0, minutos = 0;
        alterar.segundos();
        alterar.minutos()
        alterar.horas()
        alterar.trocarCor(0);
    },
    pausar : function() {
        estado = "parado";
        alterar.trocarCor(1);
    }
} 
@import url('https://fonts.googleapis.com/css2?family=Major+Mono+Display&display=swap');
/* font-family: 'Major Mono Display', monospace; */

body {
    background: linear-gradient(90deg, rgba(67,0,112,1) 15%, rgba(1,0,32,1) 79%);
}
.texto {
    font-family: 'Major Mono Display', monospace;
    display: inline;
    font-size: 50pt;
    color: #fff;
}
#main {
    margin: 0 auto;
    margin-top: 200px;
    width: 500px;
   
}
#timer {
    display: flex;
    height: 100px;
    width: 500px;
    justify-content: center;
    align-items: center;
    margin-bottom: 20px;
    
    
}
#botoes {
    display: flex;
    height: 50px;
    justify-content: space-between;
    align-items: center;       
}
.botao {
    display: inline-block;
    outline: none;
    width: 160px;
    height: 50px;
    font-family: 'Major Mono Display', monospace;
    font-size: 20pt;
    background-color: rgba(0,0,0,0);
    color: #fff;
    border: #fff solid 2px;
    border-radius: 10px;
}
.botao:hover {
    font-size: 21pt;
    color: #aaa;
    border: #aaa solid 2px;
    background-color: rgba(0,0,0,0.3);
}
<html>
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" type="text/css" href="estilo.css">
        <title> Timer </title>
    </head>
    <body>
        <div id="main">
            <div id="timer">
                <p class="texto" id="horas">00</p>
                <p class="texto">:</p>
                <p class="texto" id="minutos">00</p>
                <p class="texto">:</p>
                <p class="texto" id="segundos">00</p>
            </div>
            <div id="botoes">
                <button onclick="timer.iniciar()" id="botaoIniciar" class="botao"> iniciar </button>
                <button onclick="timer.pausar()" id="botaoPausar" class="botao"> pausar </button>
                <button onclick="timer.zerar()" id="botaoLimpar" class="botao"> zerar </button>
            </div>
        </div>
        <script src="script.js"></script>
    </body>
</html>

android – How to remove BOM (Byte-Order-Mark) from multiple UTF-8 files?

I have several UTF-8 files with BOM (Byte-Order-Mark) and I want to delete several at the same time. The need is that I have an Android project created in Eclipse and I need to migrate to Android Studio. The IDE accuses these characters below in the classes:

 ï »¿

It is giving thousands of errors, because the project contains nothing less than basically 532 classes. To perform this procedure in Android Studio version 3, it is simple, but it is very hard work, because you have to do file by file. Just follow File > Remove BOM. Look down:

insert image description here

What would be the most practical way to solve this? How to remove the bill of materials (Byte-Order-Mark) of multiple UTF-8 files?