2011-12-18 11 views
12

Conversione di nuova riga nello spazio ha un senso per l'inglese, per esempio, il seguente codice HTMLimpedire al browser di conversione ' n' tra le linee nello spazio (per i caratteri cinesi)

<p> 
This is 
a sentence. 
</p> 

otteniamo la seguente dopo la conversione alla nuova riga in spazio nel browser:

This is a sentence. 

Questo è un bene per l'inglese, ma non va bene per i caratteri cinesi, perché non usiamo gli spazi per separare le parole in cinese. Ecco un esempio (La frase cinese ha lo stesso significato di "Questa è una frase"):

<p> 
这是 
一句话。 
</p> 

ottengo il seguente risultato su Chrome, Safari e IE

这是 一句话。 

Quello che volevo è il seguendo, senza lo spazio extra.

这是一句话。 

Non so perché il browser non ignora il ritorno a capo se l'ultimo carattere della riga corrente e il primo carattere della riga successiva sono entrambi caratteri cinesi (che a mio avviso ha più senso) . Oppure hanno fornito questo meccanismo ma hanno bisogno di un trattamento speciale?

BTW, in Vim, quando si utilizza "J" per unire le linee, nessuno spazio verrà aggiunto se l'ultimo e il primo carattere delle 2 linee sono tutti caratteri cinesi. Ma per l'inglese, verrà aggiunto uno spazio. Quindi immagino che Vim abbia un trattamento speciale per questo.

Aggiornamento:

Anche se penso che questo è un problema con il browser, devo convivere con questo. Quindi, al momento, avrei preprocesso il mio testo Markdown per unire le linee cinesi prima di generare HTML. Ecco come faccio questo in Ruby, codice completo che gestisce anche le punteggiature cinesi è il gist

#encoding: UTF-8 

# Requires ruby 1.9.x, and assume using UTF-8 encoding 

class String 
    # The regular expression trick to match CJK characters comes from 
    # http://stackoverflow.com/a/4681577/306935 
    def join_chinese 
    gsub(/(\p{Han})\n(\p{Han})/m, '\1\2') 
    end 
end 
+0

Si potrebbe fare uno script per rendere i file new-line-meno da tutti i file HTML in una directory, eseguire lo script ogni volta che sei in procinto di pubblicare i tuoi file sul Web e pubblica i file risultanti. – Gravity

+0

So che questo può essere facilmente risolto usando uno script. Ma penso che il browser dovrebbe gestirlo per rendere più facile la vita a molte persone. Come vedi, Vim fa questo, e in LaTeX possiamo proibire la conversione di newline in spazi. – cyfdecyf

risposta

8

I browser trattano i newline come spazi, perché le specifiche lo dicono fin dall'HTML 2.0. In effetti, l'HTML 2.0 era più mite rispetto alle specifiche successive; "Un agente utente HTML dovrebbe trattare il fine riga in una delle sue varianti come uno spazio di parole in tutti i contesti tranne il testo preformattato." (Conventional Representation of Newlines), mentre le specifiche più recenti dicono questo più forte (descrivendolo come ciò che accade in HTML).

Lo sfondo è che HTML e il Web sono stati sviluppati pensando principalmente alle lingue dell'Europa occidentale; questo si riflette in molte caratteristiche delle specifiche originali e delle prime implementazioni. Solo lentamente sono stati internazionalizzati.

È improbabile che le regole di analisi vengano modificate. Più probabilmente, ciò che potrebbe accadere è la sensibilità al linguaggio o al rendering delle proprietà dei caratteri. Ciò significherebbe che un'interruzione di riga viene comunque considerata come uno spazio (e la stringa DOM conterrà il carattere di spazio Ascii), ma una stringa come 这 是 一句话. Sarebbe resa come se lo spazio non fosse lì. Questo a cui le specifiche HTML 4.01 sembrano riferirsi (White space). Il testo è alquanto confuso, ma penso che cerchi di dire che il comportamento dipenderà dal linguaggio del contenuto, dedotto dal browser o dichiarato nel markup.

Ma i browser non eseguono ancora tali operazioni. Dichiarare la lingua del contenuto, ad es. <html lang=zh>, è un buon principio ma ha un impatto poco pratico sul rendering, può influenzare la scelta del browser di un font predefinito (ma quanti autori consentono ai browser di utilizzare i font predefiniti?). Potrebbe anche risultare aggiunto spaziatura, se il carattere dello spazio risulta essere più ampio nel font predefinito del browser per la lingua specificata.

In base alla bozza di testo CSS3, è possibile utilizzare la proprietà text-spacing. Il valore none "Disattiva tutte le funzioni di spaziatura del testo. Tutti i caratteri a larghezza intera sono impostati con glifi a tutta larghezza. "Sfortunatamente, nessun browser sembra ancora supportarlo.

-3

È possibile utilizzare <pre> tag per il testo preformattato e si può cambiare il suo stile pure. Il testo preformattato prenderà letteralmente i caratteri di nuova riga e lo renderà come una nuova riga.

Se non si desidera <pre>:

carattere Newline è anche considerato uno spazio bianco. Quando si inserisce un carattere di nuova riga, considererà la seguente riga parte della riga precedente e semplicemente sostituirà quel carattere di nuova riga con uno spazio.

È necessario dichiarare esplicitamente una nuova riga in HTML, è sufficiente utilizzare <br>.

+0

Il mio problema è che newline non deve essere considerato come spazio bianco quando si maneggiano caratteri cinesi. Ma il browser non ha una gestione speciale per i caratteri cinesi. – cyfdecyf

+0

Beh, non è così. AFAIK, non esiste un tag HTML o un elemento CSS per risolvere questo problema e dubito che tale funzionalità esista nei browser correnti. :( –

4

C'è un modo per risolvere questo problema (soluzione classica). Per limitare i browser (correnti) di interpretare l'interruzione di linea come spazio bianco, devi impostare la dimensione del carattere su 0.

Per gli elementi figlio devi reimpostare la dimensione del carattere sul suo valore iniziale. Così, per il codice di un esempio potrebbe essere:

<p class="nowhitespace"> 
    <span>这是</span> 
    <span>一句话。</span> 
</p> 

Il CSS si potrebbero contenere codice simile al seguente:

.nowhitespace { font-size: 0; } 
.nowhitespace > span { font-size: 16px; } 
+0

Grazie, funziona davvero.Ma un problema con questo trucco è che devo avvolgere ogni riga contenente testo cinese con 'span'. Per rendere le cose più complicate, se l'inizio/fine di una riga è la parola inglese, allora non dovrei chiudere/aprire il tag 'span'. – cyfdecyf

+0

Sì, lo so - quindi nel complesso devi ancora includere una funzione per modificare le linee come quella che hai scritto sopra. Ho inventato questa soluzione alternativa per scopi di progettazione, in cui gli spazi hanno ucciso il layout. –

0

Finora la via più breve che conosco per ottenere l'effetto è quello di rompere dopo un tag di apertura . Ma non vuoi inserire tag extra nella tua fonte. Sarebbe bello se ci fossero alcuni tag che non fanno nulla. In realtà, ne esce uno, il commento.

<p> 
这是<!-- 
-->一句话。 
</p> 

Questo vi dà la seguente.

这是一句话。 

fonte di ispirazione: No extra space

Problemi correlati