سؤال

هذا أمر بعيد المنال ، ولكن لا أحد يعرف من خوارزمية تقدير و تصنيف النص والعرض (على متغير عرض الخط) بناء على محتوياته ؟

على سبيل المثال, أود أن أعرف ذلك iiiiiiii ليست واسعة كما abcdefgh, والتي بدورها ليست واسعة كما WWWWWWWW, رغم كل ثلاث سلاسل ثمانية أحرف في الطول.

هذا هو في الواقع محاولة لبناء بعض الذكاء في سلسلة اقتطاع الطريقة التي في هذه اللحظة هو صحيح اقتطاع بصريا سلسلة واسعة ، ولكن أيضا دون داع اقتطاع بصريا الضيقة سلسلة, لأن كل السلاسل التي تحتوي على نفس عدد الأحرف.ربما يكفي خوارزمية تصنيف سلسلة الإدخال كما ضيق, عادي أو واسعة ثم اقتطاع حسب الاقتضاء.

هذا السؤال ليس بلغة معينة ، ولكن إذا كان هناك خوارزمية ثم سوف تنفذ في جافا.هذا هو تطبيق ويب.أنا على علم بأن هناك إجابات على ذلك أن التعامل مع هذه المشكلة باستخدام جافا سكريبت للحصول على عرض التي تحتوي على div العنصر, ولكن كنت أتساءل إذا كان حلول من جانب الملقم هو ممكن.

هل كانت مفيدة؟

المحلول

ومعظم الأطر GUI توفر بعض الطرق لحساب مقاييس نص الخطوط على أجهزة الإخراج معينة.

وعن طريق java.awt.FontMetrics، على سبيل المثال، وأعتقد أنك يمكن أن تفعل هذا:

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);
}

ولم يتم اختباره، ولكن تحصل على هذه الفكرة.


وتحت صافي يمكنك استخدام Graphics.MeasureString طريقة. في 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));
}

نصائح أخرى

وهذا عمل بالنسبة لي:

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();      

لتطبيق ويب، لا يمكنك (حقا) الحصول على تقدير مناسب. الخطوط المختلفة لها بعرض مختلف، بحيث أن هذا لا يعتمد فقط على العميل (المستعرض) والتكبير وإعدادات DPI، ولكن أيضا على الخطوط الموجودة على هذا الجهاز (ونظام التشغيل) أو بدائل لها.

إذا كنت بحاجة إلى قياس دقيق، وخلق رسم (صورة نقطية، SVG، أو حتى بعض PDF أو أيا كان) التي سيتم layouted والمقدمة على الخادم وليس على العميل.

لا يوجد موثوق بها من جانب الخادم الحل لحساب عرض النص. (خارج خلق صورة من النص و ربما SVG)

إذا كنت في محاولة أداة مثل المتصفح لقطات وتشغيله ضد الأساسية نسبيا الصفحات, سوف نرى على الفور لماذا.فإنه من الصعب التنبؤ كيف واسعة حتى أكثر دنيوية أمثلة سوف تتحول أقل بكثير إذا قرر المستخدم التكبير في المتصفح الخ...

إنه لم يذكر على وجه التحديد قد ترغب في اقتطاع سلسلة (قد تكون مفيدة في إعطاء الحلول الممكنة) ، ولكن واحد مشترك هو لأنك تريد أن تقطع النص في بعض نقطة وتوفير القطع الناقص.

هذا يمكن القيام به بشكل موثوق على العديد من المتصفح منصات باستخدام خاصية css ، لا جافا سكريبت:

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

لديك حقا أي وسيلة لمعرفة ما المتصفح, إعدادات الخط, حجم الشاشة وما إلى العميل باستخدام.(حسنا, أحيانا رؤوس الطلب تقديم دليل ، ولكن في الحقيقة لا شيء ثابت أو موثوق بها.)

لذلك أنا:

  • عرض بعض النص عينة في Internet Explorer مع الإعدادات الافتراضية على الشاشة/نافذة بحجم 1024x768 (عموما هذا هو الحجم الأكثر شيوعا)
  • تأخذ في المتوسط الشخصيات/خط مع هذا التكوين واستخدام ذلك التقدير الخاص بك.

لقد وجدت عموما هذا "جيدة بما فيه الكفاية" ، على سبيل المثال ، من أجل تقدير عدد الأسطر أن بعض النصوص سوف يستغرق على المتصفح ، من أجل تقدير عدد الاعلانات تظهر بجانب النص.

إذا كان حقا حاسمة بالنسبة لك ، ثم يمكنني تخيل الملتوية مخطط حيث كنت في البداية إرسال بعض جافا سكريبت إلى العميل ، ثم يأخذ قياس وإرساله مرة أخرى إلى الملقم الخاص بك ومن ثم استخدام هذه المعلومات في صفحات المستقبل لهذا العميل.لا أستطيع أن أتخيل أنها عادة ما تكون يستحق المجهود.

أعتقد أن عليك أن تختار واحدة من هذه الحلول:

  • بالضبط الحل:نلخص عرض كل حرف في السلسلة (معظم واجهات برمجة التطبيقات سوف تعطيك هذه المعلومات)
  • تقدير سريع:إما أن تأخذ أو الحد الأقصى أو الحد الأدنى للعرض واضربها مع عدد من الشخصيات.

بالطبع بعض مختلطة تقدير ممكن ، ولكن أعتقد أن هذا هو الكثير من الجهد في الاتجاه الخاطئ.

لطيفة الحل * من جانب العميل، قد تتمكن من محاولة نهج هجين CSS-وجافا سكريبت على النحو الذي اقترحه <لأ href = "https://stackoverflow.com/questions/802175/truncating-long-strings-with -css-ممكنا، بعد / 802195 # 802195 "> الجواب RichieHindle لسؤالي .

وبالنظر إلى أن كنت لا تعرف ما هو الخط المستخدم سوف راجع صفحة في (يتمكنوا من تجاوز دائما اختيارك، Ctrl- + الصفحة، الخ)، و "الحق" مكان للقيام بذلك على المتصفح .. . على الرغم من المتصفحات لا تجعل من السهل!

و* عندما أقول "لطيفة"، يعني "ربما لطيفة ولكن لم أحاول في الواقع حتى الآن".

<اقتباس فقرة>   

وهذا هو في الواقع محاولة لبناء بعض الذكاء في طريقة سلسلة اقتطاع [...]

هل هو حقا يستحق كل هذا الجهد؟ كان لدينا هذه المشكلة بالضبط. وكان هذا عبر لغات. كان الإصلاح إلى ترك الأمر كما هو. تعقيد حفظ هذه المعلومات الاستخباراتية تصل الزيادة بسرعة (وربما أضعافا مضاعفة) مع كل لغة التي تضيفها الدعم ل. وبالتالي قرارنا.

<اقتباس فقرة>   

[...] خوارزمية لتقدير وتصنيف عرض نص (على خط عرض متغير) بناء على محتوياته؟

ومعظم مكتبات الخط سوف تعطيك هذه المعلومات. ولكن هذه هي جميلة الاشياء على مستوى منخفض. والفكرة الأساسية هي أن يمر في سلسلة ونعود العرض في نقاط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top