Domanda

Questa è una possibilità, ma qualcuno conosce un algoritmo per stimare e classificare la larghezza del testo (per un carattere a larghezza variabile) in base al suo contenuto?

Ad esempio, vorrei sapere che iiiiiiii non è largo quanto abcdefgh , che a sua volta non è largo come WWWWWWWW , anche se tutte e tre le stringhe sono lunghe otto caratteri.

Questo è in realtà un tentativo di costruire alcune intelligenze in un metodo di troncamento delle stringhe, che al momento sta troncando correttamente una stringa visivamente ampia, ma sta anche troncando inutilmente una stringa visivamente stretta, poiché entrambe le stringhe contengono lo stesso numero di caratteri. Probabilmente è sufficiente che l'algoritmo classifichi la stringa di input come stretta , normale o ampia e poi troncata come appropriato.

Questa domanda non è specifica per la lingua, ma se esiste un algoritmo lo implementerò in Java. Questo è per un'applicazione web. Sono consapevole che ci sono risposte su SO che affrontano questo problema usando JavaScript per ottenere la larghezza di un elemento div contenente, ma mi chiedevo se fosse possibile una soluzione lato server.

È stato utile?

Soluzione

La maggior parte dei framework GUI fornisce un modo per calcolare le metriche di testo per i caratteri su determinati dispositivi di output.

Utilizzando java.awt.FontMetrics , ad esempio, credo che tu possa farlo:

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics; 

public int measureText(Graphics g, String text) {
   g.setFont(new Font("TimesRoman", Font.PLAIN, 12));
   FontMetrics metrics = g.getFontMetrics();

   return metrics.stringWidth(text);
}

Non testato, ma hai avuto l'idea.


In .Net è possibile utilizzare la Graphics Metodo .MeasureString . In C #:

private void MeasureStringMin(PaintEventArgs e)
{

    // Set up string.
    string measureString = "Measure String";
    Font stringFont = new Font("Arial", 16);

    // Measure string.
    SizeF stringSize = new SizeF();
    stringSize = e.Graphics.MeasureString(measureString, stringFont);

    // Draw rectangle representing size of string.
    e.Graphics.DrawRectangle(new Pen(Color.Red, 1), 0.0F, 0.0F, stringSize.Width, stringSize.Height);

    // Draw string to screen.
    e.Graphics.DrawString(measureString, stringFont, Brushes.Black, new PointF(0, 0));
}

Altri suggerimenti

Questo ha funzionato per me:

AffineTransform af = new AffineTransform();     
FontRenderContext fr = new FontRenderContext(af,true,true);     
Font f = new Font("Arial", 0, 10); // use exact font
double width= f.getStringBounds("my string", fr).getWidth();      

Per un'applicazione Web, non è possibile (realmente) ottenere una stima corretta. Caratteri diversi hanno larghezze diverse, quindi ciò dipende non solo dal client (browser) e dalle sue impostazioni di zoom e DPI, ma anche dai caratteri presenti su quella macchina (e sistema operativo) o dalle loro sostituzioni.

Se hai bisogno di misurazioni esatte, crea un elemento grafico (bitmap, SVG o anche un po 'di PDF o altro) che verrà layout e renderizzato sul server e non sul client.

Non esiste una soluzione lato server affidabile per il calcolo della larghezza del testo. (al di fuori della creazione di un'immagine del testo e probabilmente SVG)

Se provi uno strumento come browser-shot e lo esegui su pagine relativamente semplici, lo farai immediatamente vedi perchè. È difficile prevedere fino a che punto andranno a finire anche gli esempi più banali, tanto meno se un utente decide di ingrandire il browser ecc ...

Non è affermato con precisione che potresti voler troncare la stringa (potrebbe essere utile nel fornire potenziali soluzioni), ma una comune è perché vuoi tagliare il testo ad un certo punto e fornire un'ellisse.

Questo può essere fatto in modo affidabile su molte piattaforme browser usando una proprietà css e NO javascript:

http://www.jide.fr/emulate -text-overflowellipsis-in-firefox-con-css

Non hai davvero modo di sapere quale browser, impostazioni dei caratteri, dimensioni dello schermo ecc. stanno usando il client. (OK, a volte le intestazioni della richiesta forniscono un'indicazione, ma in realtà nulla di coerente o affidabile.)

Quindi, vorrei:

  • mostra del testo di esempio in Internet Explorer con impostazioni predefinite su una dimensione dello schermo / finestra di 1024x768 (questa è generalmente la dimensione più comune)
  • prendi una media di caratteri / linea con questa configurazione e usala per la tua stima.

In genere ho trovato questo "abbastanza buono", ad esempio per stimare il numero di righe che un testo occuperà su un browser, al fine di stimare quante pubblicità mostrare accanto al testo.

Se per te è stato davvero cruciale, allora posso immaginare uno schema contorto in base al quale inizialmente invii del Javascript al client, che poi prende una misura e la rimanda al tuo server, e poi usi queste informazioni per il futuro pagine per quel cliente. Tuttavia, non riesco a immaginare di valerne la pena.

Penso che dovresti scegliere una di queste soluzioni:

  • Soluzione esatta: riassumi la larghezza per ogni carattere nella stringa (la maggior parte delle API ti fornirà queste informazioni)
  • Stima rapida: prendi la larghezza massima o minima e moltiplicala per il numero di caratteri.

Ovviamente è possibile una stima mista, ma penso che questo sia uno sforzo eccessivo nella direzione sbagliata.

Per una bella * soluzione lato client, potresti provare un approccio ibrido CSS e Javascript come suggerito da La risposta di RichieHindle alla mia domanda .

Dato che non sai in quale carattere l'utente vedrà la pagina (possono sempre sovrascrivere la tua selezione, Ctrl- + la pagina, ecc.), il " giusto " posto per farlo è sul browser ... anche se i browser non lo rendono facile!

* quando dico "bello", intendo "probabilmente bello, ma in realtà non l'ho ancora provato".

  

Questo è in realtà un tentativo di creare alcune intelligenze in un metodo di troncamento delle stringhe [...]

Ne vale davvero la pena? Abbiamo avuto questo esatto problema. E questo era attraverso le lingue. La correzione era di lasciarlo così com'è. La complessità di mantenere questa intelligenza aumenta rapidamente (e probabilmente in modo esponenziale) con ogni lingua per la quale si aggiunge il supporto. Da qui la nostra decisione.

  

[...] un algoritmo per stimare e classificare la larghezza del testo (per un carattere a larghezza variabile) in base al suo contenuto?

La maggior parte delle librerie di font ti darà queste informazioni. Ma questa è roba piuttosto di basso livello. L'idea di base è passare una stringa e recuperare la larghezza in punti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top